﻿Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Imports Commander_Wars.Spieletools
Public Class ObjektKartenauswahlMenü
    Inherits ObjektFormMenü
    Const XOffSetFürKOUndPanels = 350
#Region "Variablen"
    Enum KAModi
        KartenAuswahl
        SpielerAuswahl
        RegelnFestlegen
        StartBereit
        ''' <summary>
        ''' Noch nicht verwendet aber eine Lobby ist bestimmt nichts schlechtes
        ''' </summary>
        ''' <remarks></remarks>
        Lobby
        ''' <summary>
        ''' Wir wollen eine Zufallskarte erstellen.
        ''' </summary>
        ''' <remarks></remarks>
        Zufallskarte
    End Enum
    Enum KartenAuswahlBaulisten
        CW2
        CW
        AWDC
        AW
        AW2
        AWDS
        Eigene1
        Eigene2
        Eigene3
    End Enum
    ''' <summary>
    ''' Die KO's der Spieler
    ''' </summary>
    ''' <remarks></remarks>
    Public KOS(,) As ObjektKO = {}
    ''' <summary>
    ''' Die Farbtabellen
    ''' </summary>
    ''' <remarks></remarks>
    Public Farbtabellen() As Color = {}
    ''' <summary>
    ''' Die Teams
    ''' </summary>
    ''' <remarks></remarks>
    Public Teams() As Char = {}
    ''' <summary>
    ''' Die Fonds pro Stadt
    ''' </summary>
    ''' <remarks></remarks>
    Public FondsproStadt() As Integer = {}
    ''' <summary>
    ''' Die Fonds pro Fabrik
    ''' </summary>
    ''' <remarks></remarks>
    Public FondsproFabrik() As Integer = {}
    ''' <summary>
    ''' Startfonds der Spieler
    ''' </summary>
    ''' <remarks></remarks>
    Public Startfonds() As Integer = {}
    ''' <summary>
    ''' Alle geladenen Karten
    ''' </summary>
    ''' <remarks></remarks>
    Public SpielKarten() As ObjektSpielfeld
    ''' <summary>
    ''' Der Dateipfad der Karten
    ''' </summary>
    ''' <remarks></remarks>
    Public Kartenname() As String = {}
    ''' <summary>
    ''' Die momentane Karte
    ''' </summary>
    ''' <remarks></remarks>
    Public MomentaneKartenName As String
    ''' <summary>
    ''' Der Modus in dem wir unss befinden
    ''' </summary>
    ''' <remarks></remarks>
    Public KAModus As KAModi
    ''' <summary>
    ''' Die Baulisten der Spieler
    ''' </summary>
    ''' <remarks></remarks>
    Public Baulisten() As Bauliste = {}
    ''' <summary>
    ''' Die KI Stufen
    ''' </summary>
    ''' <remarks></remarks>
    Public KIStufen() As ObjektSpieler.KIStufen = {}
    ''' <summary>
    ''' Der Startspieler
    ''' </summary>
    ''' <remarks></remarks>
    Public StartSpieler As Integer = 1
    ''' <summary>
    ''' Die Anzeige Modi der Karten
    ''' </summary>
    ''' <remarks></remarks>
    Public KartenAnzeigeModi As Integer() = {-1}
    ''' <summary>
    ''' Der momentane Anzeige Modus!
    ''' </summary>
    ''' <remarks></remarks>
    Public MomentanerAnzeigeModus As Integer = 0
    ''' <summary>
    ''' Normaler Text
    ''' </summary>
    ''' <remarks></remarks>
    Dim Text As ObjektText
    ''' <summary>
    ''' Kleiner Text
    ''' </summary>
    ''' <remarks></remarks>
    Dim KleinerText As ObjektText
    ''' <summary>
    ''' Auswahlrechteck für die Karten
    ''' </summary>
    ''' <remarks></remarks>
    Dim KartenauswahlRechteck As Rectangle
    ''' <summary>
    ''' Die Anzahln der Gebäude
    ''' </summary>
    ''' <remarks></remarks>
    Dim GebäudeZahl As Point() = {}
    ''' <summary>
    ''' Texturen für die KO's
    ''' </summary>
    ''' <remarks></remarks>
    Shared KOAnzeigeTexturen() As Texture = {}
    ''' <summary>
    ''' Armeebanner
    ''' </summary>
    ''' <remarks></remarks>
    Shared ArmeeBanner() As Texture = {}
    ''' <summary>
    ''' Die Armeen
    ''' </summary>
    ''' <remarks></remarks>
    Shared Armeen() As String = {}
    ''' <summary>
    ''' Die Position bei der KO Auswahl
    ''' </summary>
    ''' <remarks></remarks>
    Dim KOCursor As Point
    ''' <summary>
    ''' Der Startindex für die Karten
    ''' </summary>
    ''' <remarks></remarks>
    Public KartenStartIndex As Integer
    ''' <summary>
    ''' Die momentane Karte
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared MomentaneKarte As Integer
    ''' <summary>
    ''' Die Armee von der die KO's angezeigt werden
    ''' </summary>
    ''' <remarks></remarks>
    Dim AusgewählteArmee As Integer = 0
    ''' <summary>
    ''' Die KO's die wir malen müssen
    ''' </summary>
    ''' <remarks></remarks>
    Dim AnzahlderGemaltenKos As Integer = 0
    ''' <summary>
    ''' Die Anzahl der Spieler der momentanen Karte
    ''' </summary>
    ''' <remarks></remarks>
    Dim AnzahlderSpieler As Integer = 0
    ''' <summary>
    ''' Der Spieler den wir momentan verändern
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared MomentanerSpieler As Integer = 0
    ''' <summary>
    ''' Die Namen der Karten, die wir anzeigen
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared KartenNamen() As String
    ''' <summary>
    ''' Die Karten die wir anzeigen
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared AngezeigteKarten() As Integer
    ''' <summary>
    ''' Der KO der gerade ausgewählt ist
    ''' </summary>
    ''' <remarks></remarks>
    Dim MomentanerKO As Integer = 0
    ''' <summary>
    ''' Checkboxen welche Einheiten wir bauen können
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared EinheitenCheckboxen As ObjektEinheitenCheckbox
    ''' <summary>
    ''' Die Breite von ich weiß nicht was
    ''' </summary>
    ''' <remarks></remarks>
    Dim SpielerZahlAnzeigeBreiten As Integer() = {}

    Public SpielerBauprioritäten As KIGenerellerSuperBau.PrioritätsBau() = {}
    ''' <summary>
    ''' Die entsprechende Höhe
    ''' </summary>
    ''' <remarks></remarks>
    Dim SpielerZahlAnzeigeHöhe As Integer
    Public Regeln As ObjektRegeln = Nothing
    Public Spielerdaten() As Spieler = {}
    Dim AlleSpielerVeränderung As AlleSpieler
    Dim Updateframe As Integer = 0
    Public KOInformation As ObjektKOInformation

    Dim bStartbereitShowButtons As Boolean = False
    Dim Frames As Integer = 0

    Dim AusgewählterDirectory As Integer = 0
    Dim DirectoryPfade As New List(Of String)
   
#End Region
    Public Sub New(Optional ByVal Netzwerkmenü As Boolean = False)
        MyBase.New(New ObjektButton() {}, Nothing, New ObjektNumericUpDown() {}, Nothing, New ObjektValueSchieber() {}, New ObjektMultiValue() {}, New ObjektCheckBox() {})
        If Netzwerkmenü = False Then
            If My.Settings.Verhältnis = Hauptmenü.Breitbild Then
                Objektverwalter.LoadHintergrund(My.Settings.Resourcenpfad + "Hintergründe\SAHintergrundGroß.png")
            Else
                Objektverwalter.LoadHintergrund(My.Settings.Resourcenpfad + "Hintergründe\SAHintergrund.png")
            End If
        End If



        If ArmeeBanner.Length = 0 Then
            For I1 = 0 To Objektverwalter.KOS.Length - 1
                If Array.IndexOf(Armeen, Objektverwalter.KOS(I1).Armee) < 0 Then
                    Array.Resize(ArmeeBanner, ArmeeBanner.Length + 1)
                    Array.Resize(Armeen, ArmeeBanner.Length)
                    ArmeeBanner(ArmeeBanner.Length - 1) = Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Kartenauswahl\" + Objektverwalter.KOS(I1).Armee + ".png")
                    Armeen(Armeen.Length - 1) = Objektverwalter.KOS(I1).Armee
                End If
            Next
        End If




        Text = New ObjektText(New String() {}, 0, 0, Nothing, "Arial", 12, FontStyle.Regular)
        If Netzwerkmenü = False Then
            KartenAuswahlErstellen()
        End If


    End Sub
  
    Public Shared Sub KOAnzeigeTexturenKaden(ByVal Farbtabelle As Color)
        Array.Resize(KOAnzeigeTexturen, 3)
        KOAnzeigeTexturen(0) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Kartenauswahl\KOAuswahl.png"), Hauptmenü.Farbtabelleerstellen(Farbtabelle))
        KOAnzeigeTexturen(1) = Grafikengine.LoadTexture(My.Settings.Resourcenpfad + "Kartenauswahl\KeinKO.png")
        KOAnzeigeTexturen(2) = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Kartenauswahl\KOAnzeigeCursor.png"), Hauptmenü.Farbtabelleerstellen(Farbtabelle))
        EinheitenCheckboxen.NeueFarbtabelle(Farbtabelle)
    End Sub

    Public Overrides Sub Frame()
        Frames += 1
        If Frames > 7 Then
            Frames = 0
            CheckButtonStarten()
            'einfach immer mal wieder prüfen, wie das mit den Starten steht.
        End If
    End Sub
    Public Sub AddKarte(ByVal Datei As String)
        Array.Resize(Kartenname, Kartenname.Length + 1)
        Array.Resize(SpielKarten, SpielKarten.Length + 1)
        Kartenname(Kartenname.Length - 1) = Datei
        SpielKarten(SpielKarten.Length - 1) = Hauptmenü.KarteDefaultLaden(Datei)
        KartenauswahlAktualiesieren()
    End Sub
#Region "Malen"
    Dim Desc As String() = {}
    Dim DescKarte As Integer = -1
    Public Overrides Sub Malen()

        Select Case KAModus
            Case ObjektKartenauswahlMenü.KAModi.KartenAuswahl
                KartenAuswahlMalen()
            Case ObjektKartenauswahlMenü.KAModi.SpielerAuswahl
                SpielerAuswahlMalen()
            Case ObjektKartenauswahlMenü.KAModi.RegelnFestlegen
                RegelnMalen()
            Case KAModi.Lobby
                LobbyMalen()
            Case KAModi.Zufallskarte
                ZufallskarteMalen()
        End Select
        MyBase.ObjekteMalen()
        Select Case KAModus
            Case ObjektKartenauswahlMenü.KAModi.SpielerAuswahl
                If KOCursor.Y > 0 And MomentanerKO >= 0 Then
                    Grafikengine.szfScale = Nothing
                    Grafikengine.ptfRotCenter = Nothing
                    With Grafikengine.recBild
                        .X = 0
                        .Y = 0
                        .Width = 211
                        .Height = 350
                    End With
                    Grafikengine.ptfPosition = New Point(XOffSetFürKOUndPanels, 55)
                    Grafikengine.Sprite.Draw2D(Objektverwalter.KOS(MomentanerKO).KOTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, 0, Grafikengine.ptfPosition, Color.FromArgb(255, 255, 255, 255))
                End If
        End Select
        'Das malen wir zu letzt!
        If Not KOInformation Is Nothing Then
            KOInformation.Malen()
        End If
    End Sub
    Private Sub KartenAuswahlMalen()
        Dim M As ObjektKartenauswahlMenü = Objektverwalter.Menü
        Dim sngRotation As Double = 0
        Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
        Grafikengine.recBild = Nothing
        Grafikengine.ptfRotCenter = Nothing
        Grafikengine.szfScale = Nothing
        Grafikengine.ptfPosition = New Drawing.Point(10, 50)
        Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        Grafikengine.ptfPosition.Y += 10
        For I = 0 To KartenNamen.Length - 1
            Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(1), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            Grafikengine.ptfPosition.Y += 21
        Next
        Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(2), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        Grafikengine.ptfPosition = New Drawing.Point(16, 61 + MomentaneKarte * 21)
        Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(3), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        Text.neuerText(KartenNamen, 16, 61, Nothing, , )
        Grafikengine.Sprite.End()
        Schriftengine.Sprite2.Begin(SpriteFlags.AlphaBlend)
        Text.Malen(Schriftengine.Sprite2)
        Text.neuerText(New String() {M.SpielKarten(AngezeigteKarten(MomentaneKarte)).Kartenname + "     " + Sprachconverter.Translate("Autor") + ":  " + M.SpielKarten(AngezeigteKarten(MomentaneKarte)).Autor, Sprachconverter.Translate("Beschreibung") + ":  "}, 400, 79, Nothing)
        Text.Malen(Schriftengine.Sprite2)
        If DescKarte <> AngezeigteKarten(MomentaneKarte) Then
            Desc = ObjektText.getStringsZeilenweise(M.SpielKarten(AngezeigteKarten(MomentaneKarte)).Beschreibung.Split("|"), Text.GetSchriftart, Hauptmenü.MainMenü.MalPanel.Width - 400)
            DescKarte = AngezeigteKarten(MomentaneKarte)
            Objektverwalter.Minimap.P.Y = 130 + 21 * Desc.Length
        End If
        Text.neuerText(Desc, 400, 120, Nothing)
        Text.Malen(Schriftengine.Sprite2)
        Schriftengine.Sprite2.End()
        Grafikengine.Sprite.Begin(SpriteFlags.AlphaBlend)
        'Hm Jetzt sollten wir noch zwei andere Dinge Anzeigen. 
        'Wir malen die Anzeige welche Karten wir angezeigt haben wollen
        Dim Breite As Integer = 16
        Dim Startpunkt As Point = New Point(Hauptmenü.MainMenü.MalPanel.Width - 20 - 8, 10)
        For I = 0 To SpielerZahlAnzeigeBreiten.Length - 1
            Startpunkt.X += (-12 - SpielerZahlAnzeigeBreiten(I))
        Next
        Startpunkt.X -= 8
        Grafikengine.ptfRotCenter = Nothing
        Grafikengine.szfScale = Nothing
        With Grafikengine.recBild
            .X = 0 : .Width = 8
            .Y = 0 : .Height = 40
        End With
        Grafikengine.ptfPosition = Startpunkt
        'linker Anfang
        Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(4), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        Grafikengine.ptfPosition.X += 8
        'Mitte
        With Grafikengine.recBild
            .X = 8 : .Width = 12
            .Y = 0 : .Height = 40
        End With
        Dim R As Integer = 0
        Dim Max As Integer = Math.DivRem(Hauptmenü.MainMenü.MalPanel.Width - Startpunkt.X - 20 - 8, 12, R)
        If R <> 0 Then Max += 1
        For I = 1 To Max
            If I = Max Then
                With Grafikengine.recBild
                    .X = 8 : .Width = R
                    .Y = 0 : .Height = 40
                End With
                Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(4), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.ptfPosition.X += R

            Else
                Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(4), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.ptfPosition.X += 12
            End If
        Next
        'Rechtes Ende
        With Grafikengine.recBild
            .X = 20 : .Width = 8
            .Y = 0 : .Height = 40
        End With
        Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(4), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        Startpunkt.X += 20
        Startpunkt.Y += 20 - SpielerZahlAnzeigeHöhe / 2
        'Wir malen noch die Schrift
        Grafikengine.Sprite.End()
        Schriftengine.Sprite2.Begin(SpriteFlags.AlphaBlend)
        For I = 0 To SpielerZahlAnzeigeBreiten.Length - 1
            Dim Farbe As Color = Color.White
            If I = M.MomentanerAnzeigeModus Then Farbe = Color.Red
            Dim T As String = M.KartenAnzeigeModi(I).ToString
            If M.KartenAnzeigeModi(I) < 0 Then T = Sprachconverter.Translate("Alle")
            Text.neuerText(New String() {T}, Startpunkt.X, Startpunkt.Y, New Color() {Farbe})
            Text.Malen(Schriftengine.Sprite2)
            Startpunkt.X += 12 + SpielerZahlAnzeigeBreiten(I)
        Next
        Schriftengine.Sprite2.End()
        Grafikengine.Sprite.Begin(SpriteFlags.AlphaBlend)

        'Wir malen die Anzeige welche und wie viele Gebäude es von den Jeweiligen Typen gibt.
        Startpunkt = New Point(350, Hauptmenü.MainMenü.MalPanel.Height - 150)

        'Wir malen Städte,Basen,Häfen,Flughäfen,HQS,Silos,Türme, Minen,Labor,Pipestation.
        Grafikengine.ptfRotCenter = Nothing
        Grafikengine.szfScale = New Size(8, Hauptmenü.Feldbreite * 2 + 12 + SpielerZahlAnzeigeHöhe)
        With Grafikengine.recBild
            .X = 0 : .Width = 8
            .Y = 0 : .Height = 40
        End With
        Grafikengine.ptfPosition = Startpunkt
        'linker Anfang
        Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(4), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        Grafikengine.ptfPosition.X += 8
        'Mitte
        With Grafikengine.recBild
            .X = 8 : .Width = 12
            .Y = 0 : .Height = 40
        End With
        Grafikengine.szfScale = New Size(12, Hauptmenü.Feldbreite * 2 + 12 + SpielerZahlAnzeigeHöhe)
        R = 0
        Max = Math.DivRem((Hauptmenü.Feldbreite + 12) * GebäudeZahl.Length + 12, 12, R)
        If R <> 0 Then Max += 1
        For I = 1 To Max
            If I = Max Then
                With Grafikengine.recBild
                    .X = 8 : .Width = R
                    .Y = 0 : .Height = 40
                End With
                Grafikengine.szfScale = New Size(R, Hauptmenü.Feldbreite * 2 + 12 + SpielerZahlAnzeigeHöhe)
                Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(4), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.ptfPosition.X += R

            Else
                Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(4), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.ptfPosition.X += 12
            End If
        Next
        'Rechtes Ende
        With Grafikengine.recBild
            .X = 20 : .Width = 8
            .Y = 0 : .Height = 40
        End With
        Grafikengine.szfScale = New Size(8, Hauptmenü.Feldbreite * 2 + 12 + SpielerZahlAnzeigeHöhe)
        Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(4), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        Grafikengine.szfScale = Nothing
        With Grafikengine.recBild
            .X = 0 : .Width = Hauptmenü.Feldbreite
            .Y = 0 : .Height = Hauptmenü.Feldbreite * 2
        End With
        For I = 0 To GebäudeZahl.Length - 1
            Grafikengine.ptfPosition = New Point(Startpunkt.X + 20 + I * (12 + Hauptmenü.Feldbreite), Startpunkt.Y + 4)
            If Objektverwalter.AlleGebäude(GebäudeZahl(I).Y).NurNeutral Then
                Grafikengine.Sprite.Draw2D(Objektverwalter.AlleGebäude(GebäudeZahl(I).Y).GebäudetexturNeutral, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            Else
                Grafikengine.Sprite.Draw2D(Objektverwalter.AlleGebäude(GebäudeZahl(I).Y).Gebäudetextur(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.Sprite.Draw2D(Objektverwalter.AlleGebäude(GebäudeZahl(I).Y).GebäudetexturMaske(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            End If

        Next

        'Wir malen noch die Schrift
        Grafikengine.Sprite.End()
        Schriftengine.Sprite2.Begin(SpriteFlags.AlphaBlend)
        For I = 0 To GebäudeZahl.Length - 1
            Dim Farbe As Color = Color.White
            Dim T As String = GebäudeZahl(I).X.ToString
            Dim TBreite As Integer = Text.GetSchriftart.MeasureString(Schriftengine.Sprite2, T, DrawTextFormat.None, Color.White).Width
            Text.neuerText(New String() {T}, Startpunkt.X + 28 + I * (Hauptmenü.Feldbreite + 12) - TBreite / 2, Startpunkt.Y + Hauptmenü.Feldbreite * 2 + 8, New Color() {Farbe})
            Text.Malen(Schriftengine.Sprite2)
        Next
        Schriftengine.Sprite2.End()
        Grafikengine.Sprite.Begin(SpriteFlags.AlphaBlend)

        'Anderer Ordner!
        If DropDownMenüs(0).GetItemNumber <> AusgewählterDirectory Then
            ChangeDirectory(DropDownMenüs(0).GetItemNumber)
        End If
    End Sub
    Public Sub SpielerAuswahlMalen()
        Dim M As ObjektKartenauswahlMenü = Objektverwalter.Menü
        EinheitenCheckboxen.Malen()
        Dim sngRotation As Double = 0
        Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
        Grafikengine.recBild = Nothing
        Grafikengine.ptfRotCenter = Nothing
        Grafikengine.szfScale = Nothing
        Grafikengine.ptfPosition = New Drawing.Point(10, 0)
        For I = 0 To ArmeeBanner.Length - 1
            If I = AusgewählteArmee Then
                Grafikengine.recBild = Nothing
            Else
                With Grafikengine.recBild
                    .Y = 11
                    .Width = 20
                    .Height = 42
                End With
            End If
            Grafikengine.Sprite.Draw2D(ArmeeBanner(I), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            Grafikengine.ptfPosition.X += 19
        Next
        Grafikengine.recBild = Nothing
        Grafikengine.ptfPosition = New Drawing.Point(0, 53)
        Grafikengine.Sprite.Draw2D(KOAnzeigeTexturen(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        Grafikengine.ptfPosition.X += 2
        Grafikengine.ptfPosition.Y += 9
        Grafikengine.Sprite.Draw2D(KOAnzeigeTexturen(1), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        intColor = Color.FromArgb(180, 255, 255, 255)
        Grafikengine.ptfPosition.X += 52
        Grafikengine.Sprite.Draw2D(KOAnzeigeTexturen(2), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        Grafikengine.ptfPosition.X += 52
        Grafikengine.Sprite.Draw2D(KOAnzeigeTexturen(2), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        Dim StartzahlderKOs As Integer = IndexOfArmee(Armeen(AusgewählteArmee))
        Dim I2 As Integer = StartzahlderKOs + 2
        While I2 < Objektverwalter.KOS.Length
            If Objektverwalter.KOS(I2).Armee = Armeen(AusgewählteArmee) Then
                Grafikengine.ptfPosition.X = 2
                Grafikengine.ptfPosition.Y += 52
                For I = 0 To 2
                    Grafikengine.Sprite.Draw2D(KOAnzeigeTexturen(2), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                    Grafikengine.ptfPosition.X += 52
                    I2 += 1
                Next
            Else
                Exit While
            End If
        End While
        intColor = Color.FromArgb(255, 255, 255, 255)
        Grafikengine.ptfPosition = New Drawing.Point(54, 62)
        With Grafikengine.recBild
            .Y = 350
            .Width = 48
            .Height = 48
        End With
        Grafikengine.Sprite.Draw2D(Objektverwalter.KOS(StartzahlderKOs).KOTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        If StartzahlderKOs + 1 < Objektverwalter.KOS.Length Then
            If Objektverwalter.KOS(StartzahlderKOs + 1).Armee = Armeen(AusgewählteArmee) Then
                Grafikengine.ptfPosition.X += 52
                Grafikengine.Sprite.Draw2D(Objektverwalter.KOS(StartzahlderKOs + 1).KOTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            End If
        End If
        I2 = StartzahlderKOs + 2
        While I2 < Objektverwalter.KOS.Length
            Grafikengine.ptfPosition.X = 2
            Grafikengine.ptfPosition.Y += 52
            For I = 0 To 2
                If Objektverwalter.KOS(I2).Armee = Armeen(AusgewählteArmee) Then
                    Grafikengine.Sprite.Draw2D(Objektverwalter.KOS(I2).KOTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                    Grafikengine.ptfPosition.X += 52
                    I2 += 1
                Else
                    Exit While
                End If
                If I2 >= Objektverwalter.KOS.Length Then Exit While
            Next
        End While
        Grafikengine.recBild = Nothing
        Grafikengine.ptfPosition = KOCursor
        Grafikengine.Sprite.Draw2D(KOAnzeigeTexturen(2), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)

        If IsNothing(M.KOS(MomentanerSpieler, 0)) = False Then
            Grafikengine.ptfPosition = New Point(167, 212)
            With Grafikengine.recBild
                .X = 144
                .Y = 350
                .Width = 32
                .Height = 12
            End With
            Grafikengine.Sprite.Draw2D(Objektverwalter.KOS(M.KOS(MomentanerSpieler, 0).Bild).KOTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            Text.neuerText(New String() {M.KOS(MomentanerSpieler, 0).KOname}, 34, -3, Nothing, , 0)
            Text.Malen(Grafikengine.Sprite)
            If IsNothing(M.KOS(MomentanerSpieler, 1)) = False Then
                Grafikengine.ptfPosition.Y += 16
                Grafikengine.Sprite.Draw2D(Objektverwalter.KOS(M.KOS(MomentanerSpieler, 1).Bild).KOTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Text.neuerText(New String() {M.KOS(MomentanerSpieler, 1).KOname}, 34, -3, Nothing, , 0)
                Text.Malen(Grafikengine.Sprite)
            End If
        End If
        If MomentanerKO >= 0 Then
            Grafikengine.Sprite.End()
            Schriftengine.Sprite2.Begin(SpriteFlags.AlphaBlend)
            Dim X As Integer = Text.GetSchriftart.MeasureString(Schriftengine.Sprite2, Objektverwalter.KOS(MomentanerKO).KOBeschreibung.Name, DrawTextFormat.None, Color.Black).Width / 2
            Text.neuerText(New String() {Objektverwalter.KOS(MomentanerKO).KOBeschreibung.Name}, 165 + 178 / 2 - X, 70, Nothing)
            Text.Malen(Schriftengine.Sprite2)
            If Objektverwalter.KOS(MomentanerKO).KOBeschreibung.Stil.Length > 0 Then
                KleinerText.neuerText(Objektverwalter.KOS(MomentanerKO).KOBeschreibung.Stil, 165, 90, Nothing)
                KleinerText.Malen(Schriftengine.Sprite2)
            End If
            Schriftengine.Sprite2.End()
            Grafikengine.Sprite.Begin(SpriteFlags.AlphaBlend)
        End If
        AlleSpielerVeränderung.Malen()
        For I = 0 To Spielerdaten.Length - 1
            Spielerdaten(I).Malen(Me)
        Next
        'Das KO Bild malen!

        'Wir schauen ob wir einen anderen Spieler haben
        UpdateSpielerAuswahl()
    End Sub
    Private Sub RegelnMalen()
        UpdateRegeln()
    End Sub
    Private Sub LobbyMalen()

    End Sub
    Private Sub ZufallskarteMalen()
        Dim sngRotation As Single = 0
        Dim intColor As Color = Color.FromArgb(255, 255, 255, 255)
        'Wir malen die Anzeige welche und wie viele Gebäude es von den Jeweiligen Typen gibt.
        Dim Startpunkt As Point = New Point(350, Hauptmenü.MainMenü.MalPanel.Height - 150)

        'Wir malen Städte,Basen,Häfen,Flughäfen,HQS,Silos,Türme, Minen,Labor,Pipestation.
        Grafikengine.ptfRotCenter = Nothing
        Grafikengine.szfScale = New Size(8, Hauptmenü.Feldbreite * 2 + 12 + SpielerZahlAnzeigeHöhe)
        With Grafikengine.recBild
            .X = 0 : .Width = 8
            .Y = 0 : .Height = 40
        End With
        Grafikengine.ptfPosition = Startpunkt
        'linker Anfang
        Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(4), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        Grafikengine.ptfPosition.X += 8
        'Mitte
        With Grafikengine.recBild
            .X = 8 : .Width = 12
            .Y = 0 : .Height = 40
        End With
        Grafikengine.szfScale = New Size(12, Hauptmenü.Feldbreite * 2 + 12 + SpielerZahlAnzeigeHöhe)
        Dim R As Integer = 0
        Dim Max As Integer = Math.DivRem((Hauptmenü.Feldbreite + 12) * GebäudeZahl.Length + 12, 12, R)
        If R <> 0 Then Max += 1
        For I = 1 To Max
            If I = Max Then
                With Grafikengine.recBild
                    .X = 8 : .Width = R
                    .Y = 0 : .Height = 40
                End With
                Grafikengine.szfScale = New Size(R, Hauptmenü.Feldbreite * 2 + 12 + SpielerZahlAnzeigeHöhe)
                Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(4), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.ptfPosition.X += R

            Else
                Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(4), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.ptfPosition.X += 12
            End If
        Next
        'Rechtes Ende
        With Grafikengine.recBild
            .X = 20 : .Width = 8
            .Y = 0 : .Height = 40
        End With
        Grafikengine.szfScale = New Size(8, Hauptmenü.Feldbreite * 2 + 12 + SpielerZahlAnzeigeHöhe)
        Grafikengine.Sprite.Draw2D(TexturenHalter.GetKartenAuswahlTexturen(4), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        Grafikengine.szfScale = Nothing
        With Grafikengine.recBild
            .X = 0 : .Width = Hauptmenü.Feldbreite
            .Y = 0 : .Height = Hauptmenü.Feldbreite * 2
        End With
        For I = 0 To GebäudeZahl.Length - 1
            Grafikengine.ptfPosition = New Point(Startpunkt.X + 20 + I * (12 + Hauptmenü.Feldbreite), Startpunkt.Y + 4)
            If Objektverwalter.AlleGebäude(GebäudeZahl(I).Y).NurNeutral Then
                Grafikengine.Sprite.Draw2D(Objektverwalter.AlleGebäude(GebäudeZahl(I).Y).GebäudetexturNeutral, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            Else
                Grafikengine.Sprite.Draw2D(Objektverwalter.AlleGebäude(GebäudeZahl(I).Y).Gebäudetextur(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                Grafikengine.Sprite.Draw2D(Objektverwalter.AlleGebäude(GebäudeZahl(I).Y).GebäudetexturMaske(0), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            End If

        Next

        'Wir malen noch die Schrift
        Grafikengine.Sprite.End()
        Schriftengine.Sprite2.Begin(SpriteFlags.AlphaBlend)
        For I = 0 To GebäudeZahl.Length - 1
            Dim Farbe As Color = Color.White
            Dim T As String = GebäudeZahl(I).X.ToString
            Dim TBreite As Integer = Text.GetSchriftart.MeasureString(Schriftengine.Sprite2, T, DrawTextFormat.None, Color.White).Width
            Text.neuerText(New String() {T}, Startpunkt.X + 28 + I * (Hauptmenü.Feldbreite + 12) - TBreite / 2, Startpunkt.Y + Hauptmenü.Feldbreite * 2 + 8, New Color() {Farbe})
            Text.Malen(Schriftengine.Sprite2)
        Next
        Schriftengine.Sprite2.End()
        Grafikengine.Sprite.Begin(SpriteFlags.AlphaBlend)


        UpdateZufallskarte()
    End Sub
#End Region
#Region "Event Handling"
    Public Overrides Sub KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
        Select Case KAModus
            Case ObjektKartenauswahlMenü.KAModi.KartenAuswahl
                Select Case e.KeyCode
                    Case My.Settings.Unten
                        KartenAnzeigeAuswählen(1)
                    Case My.Settings.Oben
                        KartenAnzeigeAuswählen(-1)
                    Case My.Settings.Rechts
                        ChangeAnzeigeKartenModus(MomentanerAnzeigeModus + 1)
                    Case My.Settings.Links
                        ChangeAnzeigeKartenModus(MomentanerAnzeigeModus - 1)
                    Case My.Settings.Bestätigen
                        KAModus = ObjektKartenauswahlMenü.KAModi.SpielerAuswahl
                        KarteFestlegen(False)
                End Select
            Case Else
                Select Case e.KeyCode
                    Case Keys.Escape
                        Hauptmenü.Ini(Hauptmenü.Formmodi.Hauptmenü)
                    Case Keys.Z
                        Zurück()
                    Case Keys.W
                        Weiter()
                    Case Keys.F
                        SpielerFarbeÄndern()
                    Case Else

                End Select
        End Select
    End Sub
    Public Overrides Sub MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        checkMouseDownObjekte(e.X, e.Y)
        If e.Button = Windows.Forms.MouseButtons.Right Then
            MouseUp(sender, e)
        End If
    End Sub
    Public Overrides Sub MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        MouseMoveObjekte(e.X, e.Y)
        Select Case KAModus
            Case ObjektKartenauswahlMenü.KAModi.KartenAuswahl
                GetMomentaneKarte(e.X, e.Y)
            Case ObjektKartenauswahlMenü.KAModi.SpielerAuswahl
                If KOInformation Is Nothing Then
                    GetKOCursorPosition(e.X, e.Y)
                End If
        End Select
    End Sub
    Public Overrides Sub MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        Dim Funktion As String = checkMouseUPObjekte(e.X, e.Y)
        If Funktion = "" Then
            Select Case e.Button
                Case MouseButtons.Left
                    Select Case KAModus
                        Case ObjektKartenauswahlMenü.KAModi.KartenAuswahl
                            KarteFestlegen(e.X, e.Y)
                        Case ObjektKartenauswahlMenü.KAModi.SpielerAuswahl
                            If CheckArmeeKlick(e.X, e.Y) = True Then
                            ElseIf CheckSpielerAuswahl(e.X, e.Y) = True Then
                            ElseIf EinheitenCheckboxen.CheckKlick(e.X, e.Y) = True Then
                            ElseIf Not checkMouseUPObjekte(e.X, e.Y) = "" Then
                            Else

                            End If
                        Case ObjektKartenauswahlMenü.KAModi.RegelnFestlegen

                    End Select
                Case MouseButtons.Right
                    Select Case KAModus
                        Case ObjektKartenauswahlMenü.KAModi.SpielerAuswahl
                            If IsNothing(KOS(MomentanerSpieler, 1)) = False Then
                                KOS(MomentanerSpieler, 1) = Nothing
                                Hauptmenü.NetzBefehlKartenauswahlSendenKO(MomentanerSpieler, "Nothing", 1)
                            ElseIf IsNothing(KOS(MomentanerSpieler, 0)) = False Then
                                KOS(MomentanerSpieler, 0) = Nothing
                                Hauptmenü.NetzBefehlKartenauswahlSendenKO(MomentanerSpieler, "Nothing", 0)
                            Else

                            End If
                        Case ObjektKartenauswahlMenü.KAModi.RegelnFestlegen
                    End Select
                Case MouseButtons.Middle
                    CheckKOInformationsAnzeige(e.X, e.Y)
            End Select
        Else
            Select Case Funktion.ToLower
                Case "zurück"
                    Zurück()
                Case "weiter"
                    Weiter()
                Case "starten"
                    KAModus = KAModi.StartBereit
                    Weiter()
                Case "spielerfarbe"
                    SpielerFarbeÄndern()
                Case "vorige farbe"
                    AndereTabelle(-1)
                Case "nächste farbe"
                    AndereTabelle(1)
                Case "runter"
                    KartenRunterSuchen(1)
                Case "hoch"
                    KartenRunterSuchen(-1)
                Case "auswählen"
                    ChangeDirectory()
                Case "zufallskarte"
                    CreateZufallskartenMenü()
                Case "generieren"
                    CreateRandomMap()
                Case "nächste karte"
                    Textboxen(0).SetText(Zufallszahl(0, Integer.MaxValue - 1))
                    CreateRandomMap()
            End Select
        End If
    End Sub
    Public Overrides Sub MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)

    End Sub
#End Region


    Public Overrides Sub SetMausBild()

    End Sub

    ''' <summary>
    ''' Lädt alle existierenden Karten in den RAM
    ''' </summary>
    ''' <param name="Ordner"></param>
    ''' <param name="Pfade"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function KartenLaden(ByVal Ordner As String, ByRef Pfade As Stack(Of String)) As ObjektSpielfeld()
        Dim Karten As New Stack(Of ObjektSpielfeld)
        Dim Pfade1 As New Stack(Of String)
        'Kartenserien (Kampagnen) werden in extra Ordnern gespeichert.
        'Dort jeweils die erste Karte laden. Sie werden zuerst geladen, da sie ganz oben aufgelistet werden sollen.
        For Each Kamp In My.Computer.FileSystem.GetDirectories(Ordner, FileIO.SearchOption.SearchTopLevelOnly, "*.kamp")
            If My.Computer.FileSystem.FileExists(Kamp + "\Landkarte.ini.comp") Then
                My.Computer.FileSystem.CopyFile(Kamp + "\Landkarte.ini.comp", Kamp + "\Landkarte.ini", True)
            End If
            If My.Computer.FileSystem.FileExists(Kamp + "\Landkarte.ini") Then
                Dim Reader As New IO.StreamReader(Kamp + "\Landkarte.ini")
                Dim Name As String = ""
                Dim Desc As String = ""
                While Reader.EndOfStream = False
                    Dim z As String = Reader.ReadLine
                    If z.ToLower.StartsWith("name:") Then
                        Name = z.Remove(0, 5)
                        Continue While
                    End If
                    If z.ToLower.StartsWith("desc:") Then
                        Desc = z.Remove(0, 5)
                        Continue While
                    End If
                End While
                'Eine Karte als Startkarte laden
                For Each Karte In My.Computer.FileSystem.GetFiles(Kamp, FileIO.SearchOption.SearchTopLevelOnly, "*.map")
                    Using Stream As New IO.FileStream(Karte, IO.FileMode.Open, IO.FileAccess.Read)
                        Dim Konverter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
                        Dim K As ObjektSpielfeld = DirectCast(Konverter.Deserialize(Stream), ObjektSpielfeld)
                        Dim CFarbe As Color = Nothing
                        For I = 0 To K.Spieler.Length - 1
                            If K.Spieler(I).Farbe = CFarbe Then
                                If I = 0 Then
                                    K.Spieler(I).Farbe = Hauptmenü.SpielerNeutral
                                Else
                                    K.Spieler(I).Farbe = Hauptmenü.GetFarbtabelle(I - 1)
                                End If
                            End If
                        Next
                        K.Kartenname = Name
                        K.Beschreibung = Desc
                        Karten.Push(K)
                        Pfade1.Push(Karte)
                    End Using
                    Exit For
                Next
            Else
                If Not My.Computer.FileSystem.FileExists(Kamp + "\Startkarte.map") Then Continue For 'Wenn die erste Karte aus irgendeinem Grund nicht existiert, machen wir besser trotzdem keinen Fehler.
                Using Stream As New IO.FileStream(Kamp + "\Startkarte.map", IO.FileMode.Open, IO.FileAccess.Read)
                    Dim Konverter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
                    Dim K As ObjektSpielfeld = DirectCast(Konverter.Deserialize(Stream), ObjektSpielfeld)
                    Dim CFarbe As Color = Nothing
                    For I = 0 To K.Spieler.Length - 1
                        If K.Spieler(I).Farbe = CFarbe Then
                            If I = 0 Then
                                K.Spieler(I).Farbe = Hauptmenü.SpielerNeutral
                            Else
                                K.Spieler(I).Farbe = Hauptmenü.GetFarbtabelle(I - 1)
                            End If
                        End If
                    Next

                    If My.Computer.FileSystem.FileExists(Kamp + "\Startkarte.ini") Then
                        Dim Reader As New IO.StreamReader(Kamp + "\Startkarte.ini")
                        While Reader.EndOfStream = False
                            Dim z As String = Reader.ReadLine
                            If z.ToLower.StartsWith("name:") Then
                                K.Kartenname = z.Remove(0, 5)
                                Continue While
                            ElseIf z.ToLower.StartsWith("desc:") Then
                                K.Beschreibung = z.Remove(0, 5)
                                Continue While
                            End If
                        End While
                    End If
                    Karten.Push(K)
                    Pfade1.Push(Kamp + "\Startkarte.map")
                End Using
            End If
        Next

        'Danach alle normalen Karten laden
        For Each Karte In My.Computer.FileSystem.GetFiles(Ordner, FileIO.SearchOption.SearchTopLevelOnly, "*.map")
            Using Stream As New IO.FileStream(Karte, IO.FileMode.Open, IO.FileAccess.Read)
                Dim Konverter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
                Dim K As ObjektSpielfeld = DirectCast(Konverter.Deserialize(Stream), ObjektSpielfeld)
                Dim CFarbe As Color = Nothing
                For I = 0 To K.Spieler.Length - 1
                    If K.Spieler(I).Farbe = CFarbe Then
                        If I = 0 Then
                            K.Spieler(I).Farbe = Hauptmenü.SpielerNeutral
                        Else
                            K.Spieler(I).Farbe = Hauptmenü.GetFarbtabelle(I - 1)
                        End If
                    End If
                Next
                
                If My.Computer.FileSystem.FileExists(Karte.Replace("map", "ini")) Then
                    Using Str As New IO.StreamReader(Karte.Replace("map", "ini"))
                        While Not Str.EndOfStream
                            Dim Z As String = Str.ReadLine.Trim
                            If Z.ToLower.StartsWith("name:") Then
                                K.Kartenname = Z.Remove(0, 5)
                                Continue While
                            End If
                            If Z.ToLower.StartsWith("desc:") Then
                                K.Beschreibung = Z.Remove(0, 5)
                                Continue While
                            End If
                        End While
                    End Using
                End If
                Karten.Push(K)
                Pfade1.Push(Karte)
            End Using
        Next
        Dim K1 As New Stack(Of ObjektSpielfeld)

        While Karten.Count > 0
            K1.Push(Karten.Pop)
            Pfade.Push(Pfade1.Pop)
        End While
        Return K1.ToArray
    End Function


    Public Overrides Sub IniMenü()
        If KAModus <> KAModi.Lobby Then
            ChangeAnzeigeKartenModus(0)
        Else

        End If
    End Sub

    Public Sub AddButton(ByVal X As Integer, ByVal Y As Integer, ByVal Bild As String, ByVal Text As String, ByVal Fixed As PointF)
        Array.Resize(Knöpfe, Knöpfe.Length + 1)
        Knöpfe(Knöpfe.Length - 1) = New ObjektButton(X, Y, Bild, Text, Fixed)
    End Sub

    ''' <summary>
    ''' Damit verändern wir die Farbe des Spielers
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub SpielerFarbeÄndern()
        ObjektMaus.Visible = False
        Cursor.Show()
        Hauptmenü.MainMenü.Farbtabelle.ShowDialog()
        'So jetzt haben wir eine Farbe festgelegt.
        'Jetzt ordnen wir sie dem Spieler zu.
        Hauptmenü.NetzBefehlKartenauswahlSendenFarbeInd(MomentanerSpieler, Hauptmenü.MainMenü.Farbtabelle.Color.ToArgb)
        Farbeändern(Hauptmenü.MainMenü.Farbtabelle.Color)
        Spielerdaten(MomentanerSpieler - 1).SetSpielerFarbe(Farbtabellen(MomentanerSpieler).ToArgb.ToString)
        ObjektMaus.Visible = True
        Cursor.Hide()
    End Sub
    ''' <summary>
    ''' Ändert die Farbe des momentanen Spielers mit dieser Farbtabelle
    ''' </summary>
    ''' <param name="neueTabelle"></param>
    ''' <remarks></remarks>
    Private Sub Farbeändern(ByVal neueTabelle As Color)
        Farbtabellen(MomentanerSpieler) = neueTabelle
        EinheitenCheckboxen.NeueFarbtabelle(New ObjektSpieler(MomentanerSpieler, neueTabelle, 0, Nothing, 0, "", "", Baulisten(MomentanerSpieler), KIStufen(MomentanerSpieler), 0), neueTabelle)
        KOAnzeigeTexturenKaden(neueTabelle)
    End Sub
    Public Sub AndereTabelle(ByVal Richtung As Integer)
        If Richtung > 1 Then
            Richtung = 1
        ElseIf Richtung < -1 Then
            Richtung = -1
        End If
        Dim MomentaneTabelle As Color = Farbtabellen(MomentanerSpieler)
        For I = 0 To Hauptmenü.AlleFarbtabellen.Length - 1
            Dim Tabelle As Color = Hauptmenü.AlleFarbtabellen(I)
            If Tabelle <> MomentaneTabelle Then
                'Wir haben die momentane Tabelle gefunden
                'wir legen die neue Tabelle fest.
                Dim NeueTabelle As Integer = I + Richtung
                If NeueTabelle < 0 Then
                    NeueTabelle = Hauptmenü.AlleFarbtabellen.Length - 1
                ElseIf NeueTabelle >= Hauptmenü.AlleFarbtabellen.Length Then
                    NeueTabelle = 0
                End If
                Hauptmenü.NetzBefehlKartenauswahlSendenFarbe(MomentanerSpieler, NeueTabelle)
                Farbeändern(Hauptmenü.AlleFarbtabellen(NeueTabelle))
                'wir verlassen die Sub
                Exit Sub
            End If
        Next
        Hauptmenü.NetzBefehlKartenauswahlSendenFarbe(MomentanerSpieler, 0)
        Farbeändern(Hauptmenü.AlleFarbtabellen(0))
    End Sub
    Public Overrides Sub SprachEingabe(ByVal Eingabe As String)
        Select Case Eingabe.ToLower
            Case "zurück"
                Zurück()
            Case "weiter"
                Weiter()
            Case "spielerfarbe"
                SpielerFarbeÄndern()
            Case "vorige farbe"
                AndereTabelle(-1)
            Case "nächste farbe"
                AndereTabelle(1)
        End Select
    End Sub
    ''' <summary>
    ''' Gibt die Zahl der Karten zurück die momentan angezeigt werden.
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetKartenZahl() As Integer
        If KartenAnzeigeModi(MomentanerAnzeigeModus) < 0 Then
            Return SpielKarten.Length
        Else
            Dim Kartenzahl As Integer = 0
            For I = 0 To SpielKarten.Length - 1
                If SpielKarten(I).Spieler.Length - 1 = KartenAnzeigeModi(MomentanerAnzeigeModus) Then
                    Kartenzahl += 1
                End If
            Next
            Return Kartenzahl
        End If
    End Function
    ''' <summary>
    ''' Wir zeigen nur die Karten mit so viel Spielern an.
    ''' </summary>
    ''' <param name="NeuSpielerModus"></param>
    ''' <remarks></remarks>
    Public Sub ChangeAnzeigeKartenModus(ByVal NeuSpielerModus As Integer)
        If NeuSpielerModus < 0 Then NeuSpielerModus = 0
        If NeuSpielerModus > KartenAnzeigeModi.Length - 1 Then NeuSpielerModus = KartenAnzeigeModi.Length - 1
        KartenStartIndex = 0
        MomentanerAnzeigeModus = NeuSpielerModus
        MomentaneKarte = 0
        KartenauswahlAktualiesieren()

        If AngezeigteKarten.Length - 1 < GetKartenZahl() - 1 Then
            If Not ExistiertButton("Runter") Then
                NeuButton(30, Hauptmenü.MainMenü.MalPanel.Height - 55, My.Settings.Resourcenpfad + "Objekte\Button.png", "Runter", New PointF(0, 1))
            End If
            If KartenStartIndex > 0 Then
                NeuButton(30, 20, My.Settings.Resourcenpfad + "Objekte\Button.png", "Hoch", New PointF())
            End If
        Else
            LöschenButton("Hoch")
            LöschenButton("Runter")
        End If
    End Sub
    Public Function IsAnzeigeKarte(ByVal Karte As Integer) As Boolean
        If KartenAnzeigeModi(MomentanerAnzeigeModus) < 0 Then
            Return True
        Else
            If SpielKarten(Karte).Spieler.Length - 1 = KartenAnzeigeModi(MomentanerAnzeigeModus) Then
                Return True
            Else
                Return False
            End If
        End If
    End Function
    ''' <summary>
    ''' Wir starten ein neues Spiel
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Spielstart(ByVal KOAuswahlKOS() As ObjektLadebildschirm.KOAuswahl, ByVal EinKOProArmee As Boolean)
        'Wir starten das Spiel. Das heißt, alle Spieler starten das Spiel. Jetzt sind also erstmal alle Spieler nicht bereit. Wenn alle Spieler das Spiel gestartet haben, sind alle Spieler bereit und wir können anfangen.
        For Each nT In Hauptmenü.NetzTeilnehmer
            nT.Bereit = False
        Next

        ResetSpielerAuswahl()

        'Ladebildschirm
        Hauptmenü.Pause = True


        Dim Name As String = Kartenname(AngezeigteKarten(MomentaneKarte))
        If Name.Contains("\") Then
            If Name.Contains(".map") Then
                ObjektLadebildschirm.Ladebildschirm = New ObjektLadebildschirm(KIStufen.Length - 1, SpielKarten(AngezeigteKarten(MomentaneKarte)).Beschreibung, Name, True, ".map", False, False, KOAuswahlKOS, EinKOProArmee)
            Else
                ObjektLadebildschirm.Ladebildschirm = New ObjektLadebildschirm(KIStufen.Length - 1, SpielKarten(AngezeigteKarten(MomentaneKarte)).Beschreibung, Name, True, ".map", False, False, KOAuswahlKOS, EinKOProArmee)
            End If
        Else
            ObjektLadebildschirm.Ladebildschirm = New ObjektLadebildschirm(KIStufen.Length - 1, SpielKarten(AngezeigteKarten(MomentaneKarte)).Beschreibung, Name, False, ".map", False, False, KOAuswahlKOS, EinKOProArmee)
        End If

        'Das für den Ladebildschirm
        Hauptmenü.Ini(Hauptmenü.Formmodi.Spiel, , True)
    End Sub
    Public Sub Spielstart()
        Spielstart(Nothing, False)
    End Sub
    Public Sub Weiter()
        Select Case KAModus
            Case KAModi.KartenAuswahl
                KAModus = KAModi.RegelnFestlegen
                KarteFestlegen(True)
                ResetKartenAuswahl()
                RegelnFestlegen()
            Case KAModi.RegelnFestlegen
                CreateRegeln()
                ResetRegelAuswahl(True)
                KAModus = KAModi.SpielerAuswahl
                SpielerAuswahlErstellen()
                ' LöschenButton("Weiter")
            Case KAModi.SpielerAuswahl
                If SpielBereit() Then
                    If KAModus = KAModi.StartBereit Then
                        If Not Hauptmenü.NetzConnected Then
                            Spielstart()
                        End If
                    End If
                End If
                NextPlayer(1)

            Case KAModi.StartBereit
                If SpielBereit() Then
                    If KAModus = KAModi.StartBereit Then
                        If Not Hauptmenü.NetzConnected Then
                            Spielstart()
                        End If
                    End If
                End If
            Case KAModi.Lobby
                KAModus = KAModi.KartenAuswahl
                KartenAuswahlErstellen()
            Case KAModi.Zufallskarte
                KAModus = KAModi.RegelnFestlegen
                ResetZufallsMenü()
                RegelnFestlegen()
        End Select
    End Sub
    Public Sub Zurück()
        Select Case KAModus
            Case KAModi.KartenAuswahl
                Hauptmenü.Ini(Hauptmenü.Formmodi.Hauptmenü)
            Case KAModi.RegelnFestlegen
                KAModus = KAModi.KartenAuswahl
                ResetRegelAuswahl(False)
                KartenAuswahlErstellen()
            Case KAModi.SpielerAuswahl
                If DropDownMenüs(0).GetItemNumber <= 0 Then
                    If Hauptmenü.NetzConnected Then
                        If Hauptmenü.NetzHosten Then
                            ResetSpielerAuswahl()
                            KAModus = KAModi.RegelnFestlegen
                            RegelnFestlegen()
                        Else
                            'Jetzt sollten wir zum Startmenü zurück.
                        End If
                    Else
                        ResetSpielerAuswahl()
                        KAModus = KAModi.RegelnFestlegen
                        RegelnFestlegen()
                    End If
                Else
                    NextPlayer(-1)
                End If
            Case KAModi.Zufallskarte
                KAModus = KAModi.KartenAuswahl
                ResetZufallsMenü()
                KartenAuswahlErstellen()
        End Select
    End Sub
    Public Overrides Sub Reset()
        MyBase.Reset()
        If Not Spielerdaten Is Nothing Then
            For I = 0 To Spielerdaten.Length - 1
                Spielerdaten(I).RealeseHandles()
            Next
        End If
        If Not AlleSpielerVeränderung Is Nothing Then
            AlleSpielerVeränderung.RealeseHandles()
        End If
    End Sub
    ''' <summary>
    ''' Wählt einen Zufälligen CO aus!
    ''' </summary>
    ''' <param name="COS"></param>
    ''' <param name="Spieler"></param>
    ''' <param name="Spielmodus"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function SelectRandomCO(ByVal COS() As ObjektKO, ByVal Spieler As Integer, ByVal Spielmodus As CommanderWarsGameModi) As ObjektKO()
        Dim COList As String() = ObjektLadeklasse.GetRandomCOList(Spielmodus)
        For I2 = 0 To 1
            If Not COS(I2) Is Nothing Then
                If COS(I2).KOID = "ZUFALL" Then
                    Dim KOID As String = ""
                    Do
                        KOID = COList(Zufallszahl(0, COList.Length - 1))
                    Loop While KOID = "ZUFALL" And KOID <> COS(0).KOID
                    COS(I2) = ObjektLadeklasse.NewKO(KOID, Spieler)
                End If
            End If
        Next
        Return COS
    End Function
#Region "Karten Auswahl"
    Public Sub KartenAuswahlErstellen()
        DirectoryPfade = New List(Of String)
        DirectoryPfade.Add(My.Settings.Resourcenpfad + "Karten\")
        For Each Directory In My.Computer.FileSystem.GetDirectories(My.Settings.Resourcenpfad + "Karten\", FileIO.SearchOption.SearchAllSubDirectories)
            If Not Directory.ToLower.EndsWith(".kamp") Then
                DirectoryPfade.Add(Directory + "\")
            End If
        Next
        Dim NUDValues(DirectoryPfade.Count - 1) As String
        For I = 0 To DirectoryPfade.Count - 1
            Dim D() As String = DirectoryPfade(I).Split("\")
            NUDValues(I) = D(D.Length - 2)
        Next
        ReDim DropDownMenüs(0)
        DropDownMenüs(0) = New ObjektDropDownMenü(350, 20, NUDValues, New PointF(0, 0))
        DropDownMenüs(0).SetItem(0)

        'Objekte erschaffen!
        Array.Resize(Knöpfe, 0)

        NeuButton(30, Hauptmenü.MainMenü.MalPanel.Height - 30, My.Settings.Resourcenpfad + "Objekte\Button.png", "Zurück", New PointF(0, 1))
        NeuButton(Hauptmenü.MainMenü.MalPanel.Width - 138, Hauptmenü.MainMenü.MalPanel.Height - 30, My.Settings.Resourcenpfad + "Objekte\Button.png", "Weiter", New PointF(1, 1))
        If Not TypeOf Me Is ObjektNetzwerkMenü Then
            NeuButton(Hauptmenü.MainMenü.MalPanel.Width / 2 - 52, Hauptmenü.MainMenü.MalPanel.Height - 30, My.Settings.Resourcenpfad + "Objekte\Button.png", "Zufallskarte", New PointF(0.5#, 1))
        End If
        NeuButton(230, 20, My.Settings.Resourcenpfad + "Objekte\Button.png", "Auswählen", New PointF(0, 0))

        'Und alle Karten
        ChangeDirectory(0)
        Objektverwalter.Minimap = New ObjektMinimap(SpielKarten(0), New Point(400, 200))


    End Sub
    Public Sub ResetKartenAuswahl()
        For Each D In DropDownMenüs
            D.RemoveHandles()
        Next
        ReDim MyBase.DropDownMenüs(-1)
        LöschenButton("Zufallskarte")
        LöschenButton("Auswählen")
        If Objektverwalter.Minimap IsNot Nothing Then
            Objektverwalter.Minimap.Wirdgemalt = False
        End If
    End Sub
    Public Sub ChangeDirectory()
        ObjektMaus.Visible = False
        Cursor.Show()
        Hauptmenü.MainMenü.fbdOrdnerAuswahl.ShowNewFolderButton = False
        Hauptmenü.MainMenü.fbdOrdnerAuswahl.Description = Sprachconverter.Translate("Commander Wars")

        If Hauptmenü.MainMenü.fbdOrdnerAuswahl.ShowDialog() = Windows.Forms.DialogResult.OK Then
            ChangeDirectory(Hauptmenü.MainMenü.fbdOrdnerAuswahl.SelectedPath)
        End If
        ObjektMaus.Visible = True
        Cursor.Hide()
    End Sub
    Public Sub ChangeDirectory(ByVal DirectoryStelle As Integer)
        AusgewählterDirectory = DirectoryStelle
        ChangeDirectory(DirectoryPfade(AusgewählterDirectory))
    End Sub
    Public Sub ChangeDirectory(ByVal Directory As String)
        Dim Karten As New Stack(Of String)
        SpielKarten = KartenLaden(Directory, Karten)
        Kartenname = Karten.ToArray
        ReDim KOS(SpielKarten(0).Spieler.Length - 1, 1)
        ReDim KartenAnzeigeModi(0)
        KartenAnzeigeModi(0) = -1
        'Welche Möglichkeiten es für die Anzeige gibt.
        For I = 0 To SpielKarten.Length - 1
            If KartenAnzeigeModi.Contains(SpielKarten(I).Spieler.Length - 1) = False Then
                Array.Resize(KartenAnzeigeModi, KartenAnzeigeModi.Length + 1)
                KartenAnzeigeModi(KartenAnzeigeModi.Length - 1) = SpielKarten(I).Spieler.Length - 1
            End If
        Next
        Array.Sort(KartenAnzeigeModi)
        Dim I2 As Integer = Math.DivRem(Hauptmenü.MainMenü.MalPanel.Height - 120, 21, 0)
        ReDim AngezeigteKarten(I2 - 1)
        ReDim KartenNamen(I2 - 1)
        MomentanerSpieler = 0
        MomentaneKarte = 0
        MomentanerAnzeigeModus = 0

        'Wir holen uns einmal die Breiten der Spieler Texturen
        ReDim SpielerZahlAnzeigeBreiten(KartenAnzeigeModi.Length - 1)
        For I = 0 To KartenAnzeigeModi.Length - 1
            Dim T As String = KartenAnzeigeModi(I).ToString
            If KartenAnzeigeModi(I) < 0 Then T = Sprachconverter.Translate("Alle")
            SpielerZahlAnzeigeBreiten(I) = Text.GetSchriftart.MeasureString(Schriftengine.Sprite2, T, DrawTextFormat.None, Color.White).Width
        Next
        SpielerZahlAnzeigeHöhe = Text.GetSchriftart.MeasureString(Schriftengine.Sprite2, "A", DrawTextFormat.None, Color.White).Height

        KleinerText = New ObjektText(New String() {}, 0, 0, Nothing, "Arial Unicode MS", 8, FontStyle.Regular)
        KartenauswahlAktualiesieren()
    End Sub
    ''' <summary>
    ''' Wir finden heraus welche Karte wir ausgewählt haben
    ''' </summary>
    ''' <param name="Y"></param>
    ''' <remarks></remarks>
    Private Sub GetMomentaneKarte(ByVal X As Integer, ByVal Y As Integer)
        'If My.Computer.Keyboard.AltKeyDown Then
        '    Console.WriteLine("OK")
        'End If                   'Ich glaube das lass ich besser nochmal stehen, falls man mal wieder was ändern will. zum Beispiel die Fixen Randwerte mit 12 und 300 ändern, die ich allein auf diese Weise mit dem Debugger geraten habe, ohne zu wissen wie groß die denn auf den Bildschirm gemalt werden.
        If X > 300 Then Exit Sub 'Hier mach ich feste Werte, weil ich nicht weiß, wie groß diese Items der Liste sind.
        If X < 12 Then Exit Sub 'Also ein Dutzend sollte man mindestens abstand vom Rand haben.
        Dim AlteKarte As Integer = MomentaneKarte
        Dim KartenlisteMax As Integer = 44 'Diese Variable soll angeben, wieviele Karten auf dem Bildschirm angezeigt werden können. Also wäre nur Eine Karte 1 (obwohl sie natürlich index 0 hat)
        'Auf meinem Bildschirm kann ich 44 sehen. Nach einer kurzen rechnung, komme ich darauf, dass bei mir 66 Pixel unten verschluckt werden. Dieser Wert ist jetzt natürlich nur bis +/- 20 Genau. Ich nehm aber lieber ihn, da ich keinen anderen habe.
        'Demnach wäre es dann wohl so ähnlich wie...
        'Momentmal, ich glaube die Kartennamen haben ja schon die Richtige Länge..
        KartenlisteMax = KartenNamen.Length 'Solange in KartenNamen nur die Karten drinstehen, die Links angezeigt werden und nicht diejenigen, die es gibt.
        Y -= 61
        '989-923
        If Y < 0 Then
            MomentaneKarte = 0
        ElseIf Y > (21 * KartenlisteMax) - 1 + 100 Then '483 Then  ???
            If KartenNamen(KartenNamen.Length - 1) = Nothing Then
                For I = 0 To KartenNamen.Length - 1
                    If KartenNamen(I) = Nothing Then
                        MomentaneKarte = I - 1
                        Exit For
                    End If
                Next
            Else
                MomentaneKarte = KartenNamen.Length - 1
            End If
        Else
            MomentaneKarte = Math.DivRem(Y, 21, 0)
            If MomentaneKarte >= KartenNamen.Length Then MomentaneKarte = KartenNamen.Length - 1
            If KartenNamen(MomentaneKarte) = Nothing Then
                For I = 0 To MomentaneKarte
                    If KartenNamen(I) = Nothing Then
                        MomentaneKarte = I - 1
                        Exit For
                    End If
                Next
            End If
        End If
        If Not MomentaneKarte = AlteKarte Then
            MinimapAktualisieren()
        End If
    End Sub
    ''' <summary>
    ''' Falls wir eine andere Karte anzeigen müssen wird hier eine neue Minimap erstellt
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub MinimapAktualisieren()
        If Objektverwalter.Minimap IsNot Nothing Then
            Objektverwalter.Minimap.Wirdgemalt = True
            Objektverwalter.Minimap = New ObjektMinimap(ObjektMinimap.Texturen, ObjektMinimap.Beschreibung, Objektverwalter.Minimap.SpielerTextur, ObjektMinimap.NeutraleTexturen, SpielKarten(AngezeigteKarten(MomentaneKarte)), Objektverwalter.Minimap.P)
            'Wir schauen mal welche Gebäude es gibt.
            ReDim GebäudeZahl(10)
            For I = 0 To GebäudeZahl.Length - 1
                Select Case I
                    Case 0
                        GebäudeZahl(0).Y = Objektverwalter.GebäudeTextur.GetGebäudeID("STADT")
                    Case 1
                        GebäudeZahl(1).Y = Objektverwalter.GebäudeTextur.GetGebäudeID("BASIS")
                    Case 2
                        GebäudeZahl(2).Y = Objektverwalter.GebäudeTextur.GetGebäudeID("WERFT")
                    Case 3
                        GebäudeZahl(3).Y = Objektverwalter.GebäudeTextur.GetGebäudeID("FLUGHAFEN")
                    Case 4
                        GebäudeZahl(4).Y = Objektverwalter.GebäudeTextur.GetGebäudeID("PIPESTATION")
                    Case 5
                        GebäudeZahl(5).Y = Objektverwalter.GebäudeTextur.GetGebäudeID("LABOR")
                    Case 6
                        GebäudeZahl(6).Y = Objektverwalter.GebäudeTextur.GetGebäudeID("HQ")
                    Case 7
                        GebäudeZahl(7).Y = Objektverwalter.GebäudeTextur.GetGebäudeID("TURM")
                    Case 8
                        GebäudeZahl(8).Y = Objektverwalter.GebäudeTextur.GetGebäudeID("MINE")
                    Case 9
                        GebäudeZahl(9).Y = Objektverwalter.GebäudeTextur.GetGebäudeID("RAKETENSILO+RAKETE")
                    Case 10
                        GebäudeZahl(10).Y = Objektverwalter.GebäudeTextur.GetGebäudeID("RADAR")
                End Select
            Next

            Dim S As ObjektSpielfeld = SpielKarten(AngezeigteKarten(MomentaneKarte))
            For I = 0 To S.Landschaften.GetLength(2) - 1
                For X = 0 To S.Breite - 1
                    For Y = 0 To S.Höhe - 1
                        Dim G As ObjektGebäude = S.Landschaften(X, Y, I).Gebäude
                        If Not G Is Nothing Then
                            Select Case G.GebäudeID
                                Case "STADT"
                                    GebäudeZahl(0).X += 1
                                Case "BASIS"
                                    GebäudeZahl(1).X += 1
                                Case "WERFT"
                                    GebäudeZahl(2).X += 1
                                Case "FLUGHAFEN"
                                    GebäudeZahl(3).X += 1
                                Case "PIPESTATION"
                                    GebäudeZahl(4).X += 1
                                Case "LABOR"
                                    GebäudeZahl(5).X += 1
                                Case "HQ"
                                    GebäudeZahl(6).X += 1
                                Case "TURM"
                                    GebäudeZahl(7).X += 1
                                Case "MINE"
                                    GebäudeZahl(8).X += 1
                                Case "RAKETENSILO+RAKETE"
                                    GebäudeZahl(9).X += 1
                                Case "RADAR"
                                    GebäudeZahl(10).X += 1
                            End Select
                        End If
                    Next
                Next
            Next
        End If
    End Sub
    Private Sub KartenAnzeigeAuswählen(ByVal Steps As Integer)
        If Steps > 0 Then
            For I = 1 To Steps
                MomentaneKarte += 1
                If MomentaneKarte > KartenNamen.Length - 1 Then
                    Dim Änderung As Integer = KartenNamen.Length - 1

                    If KartenStartIndex + KartenNamen.Length - 1 + Änderung > Kartenname.Length - 1 Then
                        KartenStartIndex = Kartenname.Length - KartenNamen.Length
                        Änderung = Kartenname.Length - MomentaneKarte - KartenStartIndex + 1
                    Else
                        KartenStartIndex += KartenNamen.Length - 1
                    End If
                    MomentaneKarte -= Änderung
                    KartenauswahlAktualiesieren()
                ElseIf KartenNamen(MomentaneKarte) = "" Then
                    MomentaneKarte -= 1
                End If
            Next
            MinimapAktualisieren()
        ElseIf Steps < 0 Then
            For I = -1 To Steps Step -1
                MomentaneKarte -= 1
                If MomentaneKarte < 0 Then
                    MomentaneKarte = 0
                    KartenStartIndex -= KartenNamen.Length - 1
                    If KartenStartIndex < 0 Then
                        KartenStartIndex = 0
                    End If
                    KartenauswahlAktualiesieren()
                End If
                MinimapAktualisieren()
            Next
        End If
    End Sub
    Public Sub KartenRunterSuchen(ByVal Richtung As Integer)
        If Richtung > 0 Then
            KartenStartIndex += KartenNamen.Length - 1
            If KartenStartIndex + KartenNamen.Length - 1 > Kartenname.Length - 1 Then
                KartenStartIndex = Kartenname.Length - KartenNamen.Length
            End If
            KartenauswahlAktualiesieren()
        ElseIf Richtung < 0 Then
            KartenStartIndex -= (KartenNamen.Length - 1)
            If KartenStartIndex < 0 Then KartenStartIndex = 0
            KartenauswahlAktualiesieren()
        End If
    End Sub
    ''' <summary>
    ''' Wir wählen die Karten durch.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub KartenauswahlAktualiesieren()
        Dim AktKarte As Integer = AngezeigteKarten(MomentaneKarte)
        Dim I2 As Integer = Math.DivRem(Hauptmenü.MainMenü.MalPanel.Height - 120, 21, 0)
        ReDim AngezeigteKarten(I2 - 1)
        ReDim KartenNamen(I2 - 1)
        MomentaneKarte = 0
        AngezeigteKarten(MomentaneKarte) = AktKarte
        KartenNamen(MomentaneKarte) = SpielKarten(AktKarte).Kartenname


        CalculateStartIndex()
        For I = 0 To KartenNamen.Length - 1
            KartenNamen(I) = ""
            AngezeigteKarten(I) = -1
        Next

        Dim MomKarte As Integer = 0
        For I2 = KartenStartIndex To SpielKarten.Length - 1
            If IsAnzeigeKarte(I2) Then
                KartenNamen(MomKarte) = SpielKarten(I2).Kartenname
                AngezeigteKarten(MomKarte) = I2
                MomKarte += 1
            End If
            If MomKarte > AngezeigteKarten.Length - 1 Then Exit For
        Next
        For I = 0 To AngezeigteKarten.Length - 1
            If AngezeigteKarten(I) < 0 Then
                Array.Resize(AngezeigteKarten, I)
                Exit For
            End If
        Next
        MinimapAktualisieren()
    End Sub
    Private Sub CalculateStartIndex()
        If KartenStartIndex < 0 Then KartenStartIndex = 0
        If KartenStartIndex > 0 Then
            Dim MaxKartenZahl As Integer = KartenNamen.Length
            Dim MomZahl As Integer = 0
            For I = KartenStartIndex To SpielKarten.Length - 1
                If IsAnzeigeKarte(I) Then
                    MomZahl += 1
                End If
                If MomZahl >= MaxKartenZahl Then
                    MomZahl = MaxKartenZahl
                    Exit For
                End If
            Next
            If ExistiertButton("Hoch") = False Then
                NeuButton(30, 20, My.Settings.Resourcenpfad + "Objekte\Button.png", "Hoch", New PointF())
            End If
            If ExistiertButton("Runter") = False Then
                NeuButton(30, Hauptmenü.MainMenü.MalPanel.Height - 55, My.Settings.Resourcenpfad + "Objekte\Button.png", "Runter", New PointF(0, 1))
            End If
            If MomZahl < MaxKartenZahl Then
                MomZahl = 0
                For I = SpielKarten.Length - 1 To 0 Step -1
                    If IsAnzeigeKarte(I) Then
                        MomZahl += 1
                    End If
                    If MomZahl >= MaxKartenZahl Then
                        MomZahl = MaxKartenZahl
                        KartenStartIndex = I
                        LöschenButton("Runter")
                        Exit Sub
                    End If
                Next
                'Es sind zu wenig Karten seltsam Startindex=0
                KartenStartIndex = 0
            ElseIf SpielKarten.Length - MomZahl = KartenStartIndex Then
                LöschenButton("Runter")
            End If
        ElseIf KartenStartIndex = 0 Then
            LöschenButton("Hoch")
            If GetKartenZahl() > AngezeigteKarten.Length Then
                If ExistiertButton("Runter") = False Then
                    NeuButton(30, Hauptmenü.MainMenü.MalPanel.Height - 55, My.Settings.Resourcenpfad + "Objekte\Button.png", "Runter", New PointF(0, 1))
                End If
            End If
        Else
        End If
    End Sub
    Private Sub KarteFestlegen(ByVal X As Integer, ByVal Y As Integer)
        If X > 300 Then 'Hier mach ich feste Werte, weil ich nicht weiß, wie groß diese Items der Liste sind.
            AndereAnzeigeKarten(X, Y)
            Exit Sub
        End If
        If X < 12 Then Exit Sub 'Also ein Dutzend sollte man mindestens abstand vom Rand haben.
        Dim AlteKarte As Integer = MomentaneKarte
        Dim KartenlisteMax As Integer = 44 'Diese Variable soll angeben, wieviele Karten auf dem Bildschirm angezeigt werden können. Also wäre nur Eine Karte 1 (obwohl sie natürlich index 0 hat)
        'Auf meinem Bildschirm kann ich 44 sehen. Nach einer kurzen rechnung, komme ich darauf, dass bei mir 66 Pixel unten verschluckt werden. Dieser Wert ist jetzt natürlich nur bis +/- 20 Genau. Ich nehm aber lieber ihn, da ich keinen anderen habe.
        'Demnach wäre es dann wohl so ähnlich wie...
        'Momentmal, ich glaube die Kartennamen haben ja schon die Richtige Länge..
        KartenlisteMax = KartenNamen.Length 'Solange in KartenNamen nur die Karten drinstehen, die Links angezeigt werden und nicht diejenigen, die es gibt.
        Y -= 61
        '989-923
        If Y < 0 Then
            'wir sind oben raus
        ElseIf Y > (21 * KartenlisteMax) - 1 + 100 Then '483 Then  ???
            'Wir sind unten raus
        Else
            Dim K As Integer = Math.DivRem(Y, 21, 0)
            If K >= KartenNamen.Length Then K = KartenNamen.Length - 1
            If KartenNamen(K) = Nothing Then
                'Da ist keine Karte
            Else
                'Da ist eine KArte die nehmen wir
                Dim M As ObjektKartenauswahlMenü = Objektverwalter.Menü
                KarteFestlegen(False)
            End If
        End If
    End Sub
    Private Sub AndereAnzeigeKarten(ByVal X As Integer, ByVal Y As Integer)
        Dim Startpunkt As Point = New Point(Hauptmenü.MainMenü.MalPanel.Width - 20 - 16, 10)
        For I = 0 To SpielerZahlAnzeigeBreiten.Length - 1
            Startpunkt.X += (-12 - SpielerZahlAnzeigeBreiten(I))
        Next
        Startpunkt.X += 20
        Startpunkt.Y += 20 - SpielerZahlAnzeigeHöhe / 2
        For I = 0 To SpielerZahlAnzeigeBreiten.Length - 1
            Dim Rechteck As New Rectangle(Startpunkt.X, Startpunkt.Y, SpielerZahlAnzeigeBreiten(I), SpielerZahlAnzeigeHöhe)
            If Rechteck.Contains(X, Y) Then
                ChangeAnzeigeKartenModus(I)
                Exit Sub
            End If
            Startpunkt.X += 12 + SpielerZahlAnzeigeBreiten(I)
        Next
    End Sub
    ''' <summary>
    ''' Wir haben uns auf eine Karte geinigt und müssen jetzt die Spieler erstellen
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub KarteFestlegen(ByVal OhneWeiter As Boolean)
        If TypeOf Me Is ObjektNetzwerkMenü Then
            Dim M As ObjektNetzwerkMenü = Me
            If M.Host = False Then
                M.btnHosten()
                Exit Sub
            End If
        End If
        LöschenButton("Runter")
        LöschenButton("Hoch")
        Dim Karte As Integer = AngezeigteKarten(MomentaneKarte)
        If Not OhneWeiter Or Not Objektverwalter.Minimap.Wirdgemalt Then
            Karte = AngezeigteKarten(MomentaneKarte)
            FestlegenDerKarte(Karte)
        End If
        'vorläufig zum Landkartenauswahlmenüsystem wechseln
        If Kartenname(Karte).EndsWith("Startkarte.map") Then
            If My.Computer.FileSystem.FileExists(Kartenname(Karte).Replace("Startkarte.map", "Landkarte.ini")) Then
                Hauptmenü.IniLandkartenMenü(Kartenname(Karte).Replace("Startkarte.map", "Landkarte.ini"), True)
                Exit Sub
            End If
        Else
            Dim Landini As String = Kartenname(Karte).Remove(Kartenname(Karte).LastIndexOf("\") + 1)
            Landini += "Landkarte.ini"
            If My.Computer.FileSystem.FileExists(Landini) Then
                Hauptmenü.IniLandkartenMenü(Landini, True)
                Exit Sub
            End If
        End If

        'Vielleicht sollte ja schon was vorgegeben sein.
        Dim KOAuswahlKOS() As ObjektLadebildschirm.KOAuswahl = {}
        Dim EinKOProArmee As Boolean = False
        If My.Computer.FileSystem.FileExists(Kartenname(Karte).Replace(".map", ".ini")) Then
            'Console.WriteLine("Eine vordefinierte Karte wird geladen")
            Dim ScriptDat As String = ""
            Dim SofortStart As Boolean = False
            Dim strR As New IO.StreamReader(Kartenname(Karte).Replace(".map", ".ini"), System.Text.Encoding.Default)
            Regeln = SpielKarten(Karte).Regeln
            While Not strR.EndOfStream
                Dim z As String = strR.ReadLine
                z = z.Trim
                If z = "" Then Continue While 'Leerzeilen ignorieren
                If z.StartsWith("'") Then Continue While 'Kommentare werden ebenfalls ignoriert. Man kann allerdings so nicht hinter eine Befehlszeile einen kommentar setzten, so wie hier :)

                If z.StartsWith("Name:") Then SpielKarten(MomentaneKarte).Kartenname = z.Remove(0, 5)
                If z.StartsWith("Desc:") Then SpielKarten(MomentaneKarte).Beschreibung = z.Remove(0, 5)
                If z.StartsWith("Script:") Then ScriptDat = z.Remove(0, 7)
                If z.StartsWith("NächsteKarte:") Then
                    Dim unnötiges As String = My.Settings.Resourcenpfad + "Karten\"
                    Dim Pfad As String = Kartenname(Karte)
                    Pfad = Pfad.Remove(0, unnötiges.Length)
                    If Pfad.Contains("\") Then
                        Pfad = Pfad.Remove(Pfad.LastIndexOf("\") + 1)
                    Else
                        'Wir sind in keinem Unterordner und alles ist in Ordnung.
                        Pfad = ""
                    End If
                    SpielKarten(MomentaneKarte).NächsteKarte = Pfad + z.Remove(0, 13)
                End If
                If z.ToLower.StartsWith("koproarmee|") Then
                    EinKOProArmee = z.Split("|")(1)
                    Continue While
                End If
                If z.StartsWith("KO|") Then 'Ein KO soll festgelegt werden.
                    Dim s() As String = z.Split("|")
                    If s.Length > 3 Then
                        If s(3) = "-" Then
                            KOS(s(1), s(2)) = Nothing 'Hier soll es keinen KO geben. geht das so oder ist Nothing nicht der richtige Befehl?
                        ElseIf s.Length > 4 Then
                            'Jetzt sollten wir irgendwie machen das man den KO auswählen kann
                            'Jetzt nehmen wir einfach den ersten
                            Array.Resize(KOAuswahlKOS, KOAuswahlKOS.Length + 1)
                            Dim KOIDS(s.Length - 4) As Integer
                            For I = 3 To s.Length - 1
                                For I2 = 0 To Objektverwalter.KOS.Length - 1
                                    If Objektverwalter.KOS(I2).KOID = s(I).ToUpper Then
                                        KOIDS(I - 3) = I2
                                        Exit For
                                    End If
                                Next
                            Next
                            KOAuswahlKOS(KOAuswahlKOS.Length - 1) = New ObjektLadebildschirm.KOAuswahl(KOIDS, s(1), s(2))
                            KOS(s(1), s(2)) = ObjektLadeklasse.NewKO(s(3), s(1))
                        Else
                            KOS(s(1), s(2)) = ObjektLadeklasse.NewKO(s(3), s(1))
                        End If
                    Else
                        'Jetzt sollte ein Auswahl-Bildschirm erscheinen, wo wir einen KO-Festlegen können.
                        KOS(s(1), s(2)) = ObjektLadeklasse.NewKO(s(3), s(1))
                    End If
                End If
                If z.StartsWith("Team|") Then
                    Dim s() As String = z.Split("|")
                    Teams(s(1)) = s(2)
                End If
                If z.StartsWith("KI|") Then
                    Dim s() As String = z.Split("|")
                    KIStufen(s(1)) = s(2)
                End If
                If z.StartsWith("Farbe|") Then
                    Dim s() As String = z.Split("|")
                    If s(2).EndsWith(".bmp") Then
                        Farbtabellen(s(1)) = Hauptmenü.CStringColor(s(2))
                    Else
                        Farbtabellen(s(1)) = Color.FromArgb(CInt(s(2)))
                    End If
                End If
                If z.StartsWith("StartGeld|") Then
                    Dim s() As String = z.Split("|")
                    Startfonds(s(1)) = s(2)
                End If
                If z.ToLower.StartsWith("FondsPS|".ToLower) Then
                    Dim s() As String = z.Split("|")
                    FondsproStadt(s(1)) = s(2)
                End If
                If z.ToLower.StartsWith("FondsPF|".ToLower) Then
                    Dim s() As String = z.Split("|")
                    FondsproFabrik(s(1)) = s(2)
                End If

                If z.StartsWith("Bauliste|") Then
                    Dim s As String() = z.Split("|")
                    Dim Bauliste As Baulisten = CInt(s(2))
                    Baulisten(s(1)) = New Bauliste(ObjektLadeklasse.GetBauliste(Bauliste))
                    If s(1) = 0 Then
                        For i = 1 To Baulisten.Length - 1
                            Baulisten(i) = New Bauliste(ObjektLadeklasse.GetBauliste(Bauliste))
                        Next
                    Else
                        Baulisten(s(1)) = New Bauliste(ObjektLadeklasse.GetBauliste(Bauliste))
                    End If
                End If
                'Wir setzen die Bauprioriäten
                If z.ToLower.StartsWith("bauprioritäten|") Then
                    Dim s As String() = z.Split("|")
                    If s(1) = 0 Then
                        For i = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
                            SpielerBauprioritäten(i) = New KIGenerellerSuperBau.PrioritätsBau(s(2), s(3), s(4), s(5), s(6), s(7), s(8), s(9), s(10), False)
                        Next
                    Else
                        SpielerBauprioritäten(s(1)) = New KIGenerellerSuperBau.PrioritätsBau(s(2), s(3), s(4), s(5), s(6), s(7), s(8), s(9), s(10), False)
                    End If
                End If

                'Alles mit den Regeln.
                If z.ToLower.StartsWith("siegbedingungen|") Then
                    Dim s() As String = z.Split("|")
                    Select Case s(1).ToLower
                        Case "aus", "off"
                            Array.Resize(Regeln.StandartSiegbedingungen, 0)
                            ReDim Regeln.Besiegbar(-1, -1)
                        Case "hq sieg", "hqsieg"
                            Regeln.SiegBedingungHinzufügen(ObjektRegeln.Siegbedingungen.KeineHQs, Teams.Length - 1)
                        Case "einheiten sieg", "einheitensieg"
                            Regeln.SiegBedingungHinzufügen(ObjektRegeln.Siegbedingungen.KeineEinheiten, Teams.Length - 1)
                        Case "besetzung sieg", "besetzungsieg"
                            Regeln.SiegBedingungHinzufügen(ObjektRegeln.Siegbedingungen.Besetzungen, Teams.Length - 1, s(2))
                        Case "zeit sieg", "zeitsieg"
                            Regeln.SiegBedingungHinzufügen(ObjektRegeln.Siegbedingungen.Zeit, Teams.Length - 1, s(2))
                    End Select
                End If

                If z.ToLower.StartsWith("unbesiegbar|") Then
                    Regeln.AddUnbesiegbar(z.Split("|")(1))
                End If


                If z.ToLower = "SofortStart=1".ToLower Then SofortStart = True
                If z.ToLower = "SofortStart=0".ToLower Then SofortStart = False

                If z.ToLower = "ZufallsWetter=1".ToLower Then Regeln.Zufallswetter = True
                If z.ToLower = "ZufallsWetter=0".ToLower Then Regeln.Zufallswetter = False

                If z.ToLower = "baublockade=1" Then Regeln.BauBlockade = True
                If z.ToLower = "baublockade=0" Then Regeln.BauBlockade = False

                If z.ToLower.StartsWith("teuerungsrate=") Then
                    Regeln.Teurungsrate = z.Split("=")(1)
                End If

                If z.ToLower.StartsWith("startwetter=") Then
                    Regeln.Standardwetter = z.Split("=")(1)
                End If

                If z.ToLower = "Kriegsnebel=0".ToLower Then Regeln.Nebel = Nebelarten.Aus
                If z.ToLower = "Kriegsnebel=1".ToLower Then Regeln.Nebel = Nebelarten.Nebel
                If z.ToLower = "Kriegsnebel=2".ToLower Then Regeln.Nebel = Nebelarten.Kriegsnebel

                If z.ToLower = "Luftschlacht=0".ToLower Then Regeln.Luftschlacht = False
                If z.ToLower = "Luftschlacht=1".ToLower Then Regeln.Luftschlacht = True

                If z.ToLower = "LevelModus=0".ToLower Then Regeln.LevelModus = False
                If z.ToLower = "LevelModus=1".ToLower Then Regeln.LevelModus = True

                If z.ToLower.StartsWith("gamemode:") Then
                    Dim GM As Integer = z.Remove(0, 9) - 1
                    If GM >= 0 Then
                        If GM <> My.Settings.CommanderWarsGameMoodus Then
                            If GM >= 0 Then
                                My.Settings.CommanderWarsGameMoodus = GM
                                Objektverwalter.LoadNewGameModus(My.Settings.TerrainStyle)
                                SpielKarten(AngezeigteKarten(MomentaneKarte)).CommanderWarsModus = GM
                            End If
                        End If
                    End If
                End If
            End While
            strR.Dispose()
            SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln = Regeln
            'eventuell noch das Script laden...
            If Not ScriptDat = "" Then 'Offensichtlich gibt es was..
                ObjektScript.NeuScript(ScriptDat)
                'If IsNothing(M.SpielKarten(MomentaneKarte).Scripts) Then
                '    ReDim M.SpielKarten(MomentaneKarte).Scripts(0)
                'Else
                '    Array.Resize(M.SpielKarten(MomentaneKarte).Scripts, M.SpielKarten(MomentaneKarte).Scripts.Length + 1)
                'End If
                SpielKarten(AngezeigteKarten(MomentaneKarte)).Scripts = ObjektScript.Scripts
            End If
            '... oder gleich das ganze Auswahlmenü überspringen...
            If SofortStart Then 'Das muss man noch etwas verfeinern, aber das Problem ist Spielstart() ist sowohl, wie der Name sagt, Spielstart, als auch das Ende des Regelmenüs, also werden dort CheckBoxen und so geprüft, deshalb dieser umständliche Weg.
                If KOAuswahlKOS.Length > 0 Then
                    Spielstart(KOAuswahlKOS, EinKOProArmee)
                Else
                    Spielstart()
                End If
            ElseIf Not OhneWeiter Then
                Weiter()
            End If
        ElseIf Not OhneWeiter Then
            Weiter()

        End If
    End Sub
    Protected Sub FestlegenDerKarte(ByVal Karte As Integer)
        Objektverwalter.Minimap.Wirdgemalt = False
        MomentanerSpieler = 1
        MomentaneKarte = 0
        AngezeigteKarten(MomentaneKarte) = Karte

        AnzahlderSpieler = SpielKarten(Karte).Spieler.Length
        ReDim KOS(AnzahlderSpieler - 1, 1)
        ReDim Farbtabellen(AnzahlderSpieler - 1)
        ReDim Teams(AnzahlderSpieler - 1)
        ReDim FondsproStadt(AnzahlderSpieler - 1)
        ReDim FondsproFabrik(AnzahlderSpieler - 1)
        ReDim Startfonds(AnzahlderSpieler - 1)
        ReDim Baulisten(AnzahlderSpieler - 1)
        ReDim KIStufen(AnzahlderSpieler - 1)
        ReDim SpielerBauprioritäten(AnzahlderSpieler - 1)
        MomentaneKartenName = Kartenname(Karte)
        KOS(0, 0) = ObjektLadeklasse.NewKO("Andy", 1)
        Farbtabellen(0) = Hauptmenü.SpielerNeutral
        Teams(0) = "q"
        Dim TeamZahl As Integer = [Enum].GetNames(Objektverwalter.ABC.A.GetType).Length
        For I = 1 To AnzahlderSpieler - 1
            Farbtabellen(I) = SpielKarten(Karte).Spieler(I).Farbe
            Dim Z As Integer = I
            While Z > TeamZahl
                Z -= TeamZahl
            End While
            Teams(I) = SpielKarten(Karte).Spieler(I).Team.ToString
            FondsproStadt(I) = SpielKarten(Karte).Spieler(I).FondsproStadt
            Startfonds(I) = SpielKarten(Karte).Spieler(I).Fonds
            FondsproFabrik(I) = SpielKarten(Karte).Spieler(I).Fabrikfonds
            KIStufen(I) = SpielKarten(Karte).Spieler(I).KIStufe
        Next
        ' 

        'Bevor noch irgendwelche alten Scripts hier rumliegen räum ich sie am besten auf.
        ObjektScript.Reset()
    End Sub
    Public Function GetMomentaneKarte() As String
        Return Kartenname(MomentaneKarte)
    End Function
#End Region
#Region "SpielerAuwahl"
    Protected Sub ResetSpielerAuswahl()
        For I = 0 To Spielerdaten.Length - 1
            Spielerdaten(I).RealeseHandles()
        Next
        Array.Resize(Spielerdaten, 0)
        For I = 0 To DropDownMenüs.Length - 1
            If Not DropDownMenüs Is Nothing Then
                DropDownMenüs(I).RemoveHandles()
            End If
        Next
        ReDim Labels(-1)
        ReDim DropDownMenüs(-1)
        LöschenButton("Spielerfarbe")
        If Not AlleSpielerVeränderung Is Nothing Then
            AlleSpielerVeränderung.RealeseHandles()
            AlleSpielerVeränderung = Nothing
        End If
        If Hauptmenü.NetzConnected Then
            LöschenButton("Bereit")
        Else
            LöschenButton("Starten")
        End If
        bStartbereitShowButtons = False
        'Alle Panels löschen
        For Each P In Panels
            P.RemoveHandles()
        Next
        ReDim Panels(-1)
    End Sub
    Public Sub SpielerAuswahlErstellen()
        For I = 0 To Spielerdaten.Length - 1
            Spielerdaten(I).RealeseHandles()
        Next
        If Not AlleSpielerVeränderung Is Nothing Then
            AlleSpielerVeränderung.RealeseHandles()
        End If
        ReDim NUDS(-1)
        ReDim SUDS(-1)
        ReDim Labels(0)
        ReDim MultiValues(-1)
        ReDim CheckBoxen(-1)
        ReDim DropDownMenüs(0)
        'Panel für die Einheiten CheckBoxen
        Dim PanelEinheitenMenü As New ObjektPanelEinheitenMenü(New Rectangle(XOffSetFürKOUndPanels, 0, Hauptmenü.Rechteck.Width / 2, 200), New PointF(0.5#, 0), 1, False)
        MyBase.NeuPanel(PanelEinheitenMenü)
        EinheitenCheckboxen = New ObjektEinheitenCheckbox(New ObjektSpieler(1, Farbtabellen(1), 0, Nothing, 0, "", "", Nothing, ObjektSpieler.KIStufen.Mensch, 0), New PointF(0.5#, 0), PanelEinheitenMenü, Math.DivRem(CInt(Hauptmenü.MainMenü.MalPanel.Width / 2), CInt(Hauptmenü.Feldbreite * 5 / 2), 0), New Point(10, 10))
        PanelEinheitenMenü.SetEinheitenMenü(EinheitenCheckboxen)

        KOAnzeigeTexturenKaden(SpielKarten(MomentaneKarte).Spieler(1).Farbe)
        ArmeeFestlegen(0)
        MomentanerSpieler = 1
        'Die Values für alle



        'Nur vorübergehend will ich auch anders machen.

        'Panel erstellen und Objekte hinzufügen!
        Dim SpielerPanel As New ObjektPanel2D(New Rectangle(XOffSetFürKOUndPanels, 210, Hauptmenü.Rechteck.Width / 2, Hauptmenü.Rechteck.Height - 210 - 150), New PointF(0.5#, 0.75#), 1, False)
        Array.Resize(Spielerdaten, AnzahlderSpieler - 1)
        For I = 1 To AnzahlderSpieler - 1
            Spielerdaten(I - 1) = New Spieler(I, Me, New Point(0, 60 + (I - 1) * 30), SpielerPanel)
        Next
        AlleSpielerVeränderung = New AlleSpieler(1, Me, 10, SpielerPanel)
        Labels(0) = New ObjektLabel(10, 10, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Spieler"}, New Point(0, 0), 10, 0, New PointF(), SpielerPanel)
        DropDownMenüs(0) = New ObjektDropDownMenü(60, 10, GetSpielerItems, New PointF(), True, SpielerPanel)
        MyBase.NeuPanel(SpielerPanel)

        'Spielerfarbe Button
        AddButton(Hauptmenü.Rechteck.Width / 2 - 54, Hauptmenü.Rechteck.Height - 30, My.Settings.Resourcenpfad + "Objekte\Button.png", "Spielerfarbe", New PointF(0.5#, 1))




        For I = 0 To Spielerdaten.Length - 1
            Spielerdaten(I).Update(Me)
        Next
        CheckButtonStarten()
    End Sub
    ''' <summary>
    ''' Gibt zurück welche Spieler wir veränden dürfen
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Protected Function GetSpielerItems() As String()
        Dim Items() As String = {}
        If Hauptmenü.NetzConnected Then
            If Hauptmenü.NetzHosten Then
                For I = 0 To Spielerdaten.Length - 1
                    If Spielerdaten(I).GetKIStufe <> ObjektSpieler.KIStufen.Passiv Then
                        Array.Resize(Items, Items.Length + 1)
                        Items(Items.Length - 1) = (I + 1).ToString
                    End If
                Next
            Else
                For I = 0 To Spielerdaten.Length - 1
                    If Spielerdaten(I).GetKIStufe = ObjektSpieler.KIStufen.Mensch Then
                        Array.Resize(Items, Items.Length + 1)
                        Items(Items.Length - 1) = (I + 1).ToString
                    End If
                Next
            End If
        Else
            Array.Resize(Items, AnzahlderSpieler - 1)
            For I = 0 To Items.Length - 1
                Items(I) = (I + 1).ToString
            Next
        End If
        Return Items
    End Function
    ''' <summary>
    ''' Wir legen einen KO fest
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function CheckSpielerAuswahl(ByVal X As Integer, ByVal Y As Integer) As Boolean
        Dim Rechteck As New Rectangle(2, 62, 156, 48 + Math.DivRem(AnzahlderGemaltenKos, 3, 0) * 52)
        If Rechteck.Contains(X, Y) Then
            If X <= 51 And Y <= 111 Then
                If IsNothing(KOS(MomentanerSpieler, 1)) = False Then
                    KOS(MomentanerSpieler, 1) = Nothing
                Else
                    KOS(MomentanerSpieler, 0) = Nothing
                End If
            Else
                Dim StartzahlderKOs As Integer = IndexOfArmee(Armeen(AusgewählteArmee))
                Dim StartRechteck = New Rectangle(Rechteck.X + 52, Rechteck.Y, 48, 48)
                Dim I2 As Integer = 1
                For I = 0 To AnzahlderGemaltenKos - 1
                    If StartRechteck.Contains(X, Y) Then
                        If IsNothing(KOS(MomentanerSpieler, 0)) Or My.Settings.CommanderWarsGameMoodus = CommanderWarsGameModi.AdvanceWarsDC Then
                            KOS(MomentanerSpieler, 0) = ObjektLadeklasse.NewKO(Objektverwalter.KOS(StartzahlderKOs + I).KOID, MomentanerSpieler)
                            Hauptmenü.NetzBefehlKartenauswahlSendenKO(MomentanerSpieler, Objektverwalter.KOS(StartzahlderKOs + I).KOID, 0)
                        ElseIf Not KOS(MomentanerSpieler, 0).KOID = Objektverwalter.KOS(StartzahlderKOs + I).KOID Or KOS(MomentanerSpieler, 0).KOID = "ZUFALL" Then
                            KOS(MomentanerSpieler, 1) = ObjektLadeklasse.NewKO(Objektverwalter.KOS(StartzahlderKOs + I).KOID, MomentanerSpieler)
                            Hauptmenü.NetzBefehlKartenauswahlSendenKO(MomentanerSpieler, Objektverwalter.KOS(StartzahlderKOs + I).KOID, 1)
                        End If
                        Exit For
                    End If
                    I2 += 1
                    StartRechteck.X += 52
                    If I2 > 2 Then
                        I2 = 0
                        StartRechteck.X = Rechteck.X
                        StartRechteck.Y += 52
                    End If
                Next
            End If
            Return True
        Else
            Return False
        End If
    End Function
    Private Function CheckKOInformationsAnzeige(ByVal X As Integer, ByVal Y As Integer) As Boolean
        Dim Rechteck As New Rectangle(2, 62, 156, 48 + Math.DivRem(AnzahlderGemaltenKos, 3, 0) * 52)
        If Rechteck.Contains(X, Y) Then
            If X <= 51 And Y <= 111 Then
            Else
                Dim StartzahlderKOs As Integer = IndexOfArmee(Armeen(AusgewählteArmee))
                Dim StartRechteck = New Rectangle(Rechteck.X + 52, Rechteck.Y, 48, 48)
                Dim I2 As Integer = 1
                For I = 0 To AnzahlderGemaltenKos - 1
                    If StartRechteck.Contains(X, Y) Then
                        If Objektverwalter.KOS(StartzahlderKOs + I).KOID <> "ZUFALL" Then
                            KOInformation = New ObjektKOInformation(0, 0, StartzahlderKOs + I, New PointF)
                        End If
                        Exit For
                    End If
                    I2 += 1
                    StartRechteck.X += 52
                    If I2 > 2 Then
                        I2 = 0
                        StartRechteck.X = Rechteck.X
                        StartRechteck.Y += 52
                    End If
                Next
            End If
            Return True
        Else
            Return False
        End If
    End Function
    ''' <summary>
    ''' Wir schauen ob wir die KO'S einer anderen Armee anzeigen müssen.
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function CheckArmeeKlick(ByVal X As Integer, ByVal Y As Integer) As Boolean
        Dim Rechteck As New Rectangle(10, 0, 19 * ArmeeBanner.Length, 42)
        If Rechteck.Contains(X, Y) Then
            ArmeeFestlegen(Math.DivRem(X - Rechteck.X, 19, 0))
            Return True
        End If
        Return False
    End Function
    ''' <summary>
    ''' legt die Armee des Spielers fest
    ''' </summary>
    ''' <param name="Armee"></param>
    ''' <remarks></remarks>
    Private Sub ArmeeFestlegen(ByVal Armee As Integer)
        AusgewählteArmee = Armee
        AnzahlderGemaltenKos = LastIndexOfArmee(Armeen(AusgewählteArmee)) - IndexOfArmee(Armeen(AusgewählteArmee)) + 1
    End Sub
    ''' <summary>
    ''' Wir schauen nach, von welchem KO wir die Informationen anzeigen müssen
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <remarks></remarks>
    Private Sub GetKOCursorPosition(ByVal X As Integer, ByVal Y As Integer)
        Dim Startrechteck As New Rectangle(2, 62, 48, 48)
        Dim I2 As Integer = 0
        For I = 0 To AnzahlderGemaltenKos
            If Startrechteck.Contains(X, Y) Then
                If I = 0 Then
                    MomentanerKO = -1
                Else
                    MomentanerKO = I + IndexOfArmee(Armeen(AusgewählteArmee)) - 1
                End If
                KOCursor = New Point(Startrechteck.X, Startrechteck.Y)
                Exit For
            End If
            Startrechteck.X += 52
            I2 += 1
            If I2 > 2 Then
                I2 = 0
                Startrechteck.X = 2
                Startrechteck.Y += 52
            End If
            If I = AnzahlderGemaltenKos Then
                KOCursor = New Point(-50, -50)
            End If
        Next
    End Sub
    ''' <summary>
    ''' Gibt den ersten KO einer Armee in der Structure Liste zurück
    ''' </summary>
    ''' <param name="Armee"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function IndexOfArmee(ByVal Armee As String)
        For I = 0 To Objektverwalter.KOS.Length - 1
            If Objektverwalter.KOS(I).Armee = Armee Then
                Return I
            End If
        Next
        Return 0
    End Function
    ''' <summary>
    ''' Gibt den letzten KO einer Armee in der Structure Liste zurück
    ''' </summary>
    ''' <param name="Armee"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function LastIndexOfArmee(ByVal Armee As String)
        For I = Objektverwalter.KOS.Length - 1 To 0 Step -1
            If Objektverwalter.KOS(I).Armee = Armee Then
                Return I
            End If
        Next
        Return 0
    End Function
    ''' <summary>
    ''' Sendet die Spielerdaten an alle anderen.
    ''' </summary>
    ''' <param name="Spieler"></param>
    ''' <remarks></remarks>
    Private Sub SendPlayerInformation(ByVal Spieler As Integer)
        If Hauptmenü.NetzConnected And Hauptmenü.NetzHosten Then
            Hauptmenü.NetzBefehlKartenauswahlSendenFondsProFabrik(Spieler, FondsproFabrik(Spieler))
            Hauptmenü.NetzBefehlKartenauswahlSendenFondsProStadt(Spieler, FondsproStadt(Spieler))
            If KIStufen(Spieler) <> ObjektSpieler.KIStufen.Passiv Then
                Hauptmenü.NetzBefehlKartenauswahlSendenKI(Spieler, KIStufen(Spieler))
            End If
            Hauptmenü.NetzBefehlKartenauswahlSendenStartgeld(Spieler, Startfonds(Spieler))
            Hauptmenü.NetzBefehlKartenauswahlSendenTeam(Spieler, Teams(Spieler))
            If KIStufen(Spieler) <> ObjektSpieler.KIStufen.Passiv Then
                If KOS(Spieler, 0) Is Nothing Then
                    Hauptmenü.NetzBefehlKartenauswahlSendenKO(Spieler, "Nothing", 0)
                    Hauptmenü.NetzBefehlKartenauswahlSendenKO(Spieler, "Nothing", 1)
                ElseIf KOS(Spieler, 1) Is Nothing Then
                    Hauptmenü.NetzBefehlKartenauswahlSendenKO(Spieler, KOS(Spieler, 0).KOID, 0)
                    Hauptmenü.NetzBefehlKartenauswahlSendenKO(Spieler, "Nothing", 1)
                Else
                    Hauptmenü.NetzBefehlKartenauswahlSendenKO(Spieler, KOS(Spieler, 0).KOID, 0)
                    Hauptmenü.NetzBefehlKartenauswahlSendenKO(Spieler, KOS(Spieler, 1).KOID, 1)
                End If
                If Spielerdaten(Spieler - 1).GetBauliste <> "Ind." Then
                    Dim BListe As KartenAuswahlBaulisten = [Enum].Parse(ObjektKartenauswahlMenü.KartenAuswahlBaulisten.AW.GetType, Spielerdaten(Spieler - 1).GetBauliste.Replace(" ", ""))
                    Select Case BListe
                        Case KartenAuswahlBaulisten.Eigene1
                            Hauptmenü.NetzBefehlKartenauswahlSendenBauliste(Spieler, Baulisten(Spieler))
                        Case KartenAuswahlBaulisten.Eigene2
                            Hauptmenü.NetzBefehlKartenauswahlSendenBauliste(Spieler, Baulisten(Spieler))
                        Case KartenAuswahlBaulisten.Eigene3
                            Hauptmenü.NetzBefehlKartenauswahlSendenBauliste(Spieler, Baulisten(Spieler))
                        Case Else
                            Hauptmenü.NetzBefehlKartenauswahlSendenBauliste(Spieler, BListe)
                    End Select
                Else
                    Hauptmenü.NetzBefehlKartenauswahlSendenBauliste(Spieler, Baulisten(Spieler))
                End If
                'Farben senden...
                ' Hauptmenü.NetzBefehlKartenauswahlSendenFarbeInd()
            Else
                ' Console.WriteLine("Ein anderer Computerspieler?")
            End If
        Else
            'Jetzt noch die KO's und so senden
            If KIStufen(Spieler) = ObjektSpieler.KIStufen.Mensch Then
                Hauptmenü.NetzBefehlKartenauswahlSendenKI(Spieler, KIStufen(Spieler))
                Hauptmenü.NetzBefehlKartenauswahlSendenTeam(Spieler, Teams(Spieler))
                If KOS(Spieler, 0) Is Nothing Then
                    Hauptmenü.NetzBefehlKartenauswahlSendenKO(Spieler, "Nothing", 0)
                    Hauptmenü.NetzBefehlKartenauswahlSendenKO(Spieler, "Nothing", 1)
                ElseIf KOS(Spieler, 1) Is Nothing Then
                    Hauptmenü.NetzBefehlKartenauswahlSendenKO(Spieler, KOS(Spieler, 0).KOID, 0)
                    Hauptmenü.NetzBefehlKartenauswahlSendenKO(Spieler, "Nothing", 1)
                Else
                    Hauptmenü.NetzBefehlKartenauswahlSendenKO(Spieler, KOS(Spieler, 0).KOID, 0)
                    Hauptmenü.NetzBefehlKartenauswahlSendenKO(Spieler, KOS(Spieler, 1).KOID, 1)
                End If
            End If
        End If
    End Sub
#Region "SpielerAnzeige und Veränderung"
    Public Class Spieler
        ''' <summary>
        ''' 0=KI Stufe
        ''' 1=Teams
        ''' 2=Bauliste
        ''' 3=Spielerfarbe
        ''' </summary>
        ''' <remarks></remarks>
        Dim DDMS() As ObjektDropDownMenü = {}
        ''' <summary>
        ''' 0=Startfonds
        ''' 1=Fondspro Stadt
        ''' 2=Fabrikfonds
        ''' </summary>
        ''' <remarks></remarks>
        Dim NUDS() As ObjektNumericUpDown = {}
        Dim Spieler As Integer = 0
        Dim Position As Point
        Dim Netzzugriff As Boolean = False
        Dim Handler As ObjektPanel2D
        Public Sub New(ByVal Spieler As Integer, ByVal Menü As ObjektKartenauswahlMenü, ByVal Position As Point, ByVal Handler As ObjektPanel2D)
            Me.Position = Position
            Me.Spieler = Spieler
            Me.Handler = Handler
            ReDim NUDS(2)
            ReDim DDMS(3)
            Dim Werte() As String = [Enum].GetNames(ObjektSpieler.KIStufen.Mensch.GetType)
            If Hauptmenü.NetzConnected Then
                Array.Resize(Werte, Werte.Length - 1)
            Else
                Array.Resize(Werte, Werte.Length - 2)
            End If
            DDMS(1) = New ObjektDropDownMenü(110, Position.Y, Werte, New PointF, Netzzugriff, Handler)
            If Hauptmenü.NetzConnected And Spieler <> 1 And Hauptmenü.NetzHosten Then
                DDMS(1).SetItem(ObjektSpieler.KIStufen.Offen.ToString)
                Menü.KIStufen(Spieler) = ObjektSpieler.KIStufen.Offen
            Else
                DDMS(1).SetItem(Menü.KIStufen(Spieler).ToString)
            End If

            NUDS(0) = New ObjektNumericUpDown(Menü.Startfonds(Spieler), 0, 99500, My.Settings.Resourcenpfad + "Objekte\NUD.png", New Point(220, Position.Y), 500, New PointF, , Handler)
            NUDS(1) = New ObjektNumericUpDown(Menü.FondsproStadt(Spieler), 500, 99500, My.Settings.Resourcenpfad + "Objekte\NUD.png", New Point(295, Position.Y), 500, New PointF, , Handler)
            NUDS(2) = New ObjektNumericUpDown(Menü.FondsproFabrik(Spieler), 500, 99500, My.Settings.Resourcenpfad + "Objekte\NUD.png", New Point(370, Position.Y), 500, New PointF, , Handler)
            DDMS(0) = New ObjektDropDownMenü(450, Position.Y, [Enum].GetNames(Objektverwalter.ABC.A.GetType), New PointF, Netzzugriff, Handler)
            DDMS(0).SetItem(Menü.Teams(Spieler))
            DDMS(2) = New ObjektDropDownMenü(510, Position.Y, New String() {"AW", "AW 2", "AW DS", "CW", "AW DC", "CW 2", "Ind 1", "Ind 2", "Ind 3"}, New PointF, Netzzugriff, Handler)
            Select Case My.Settings.CommanderWarsGameMoodus
                Case CommanderWarsGameModi.AdvanceWars
                    DDMS(2).SetItem(KartenAuswahlBaulisten.AW.ToString)
                Case CommanderWarsGameModi.AdvanceWars2
                    DDMS(2).SetItem("AW 2")
                Case CommanderWarsGameModi.AdvanceWarsDS
                    DDMS(2).SetItem("AW DS")
                Case CommanderWarsGameModi.AdvanceWarsDC
                    DDMS(2).SetItem("AW DC")
                Case CommanderWarsGameModi.CommanderWars2
                    DDMS(2).SetItem("CW 2")
                Case Else
                    DDMS(2).SetItem(KartenAuswahlBaulisten.CW.ToString)
            End Select
            Dim C(Hauptmenü.AlleFarbtabellen.Length - 1) As Color
            For I = 0 To C.Length - 1
                C(I) = Hauptmenü.AlleFarbtabellen(I)
            Next
            DDMS(3) = New ObjektDropDownMenü(70, Position.Y, C, New PointF, Netzzugriff, Handler)
            DDMS(3).SetItem(Menü.Farbtabellen(Spieler).ToArgb.ToString)
            'Handler hinzufügen
            AddHandler Hauptmenü.MainMenü.MalPanel.MouseDown, AddressOf MouseDown
            AddHandler Hauptmenü.MainMenü.MalPanel.MouseUp, AddressOf MouseUp

            SetNetzzugriff(Menü)
        End Sub
        Public Sub Malen(ByVal M As ObjektKartenauswahlMenü)
            For I = 0 To NUDS.Length - 1
                NUDS(I).Malen()
            Next
            For I = 0 To DDMS.Length - 1
                DDMS(I).Malen()
            Next
            Dim R As New Rectangle(10, Position.Y - 2, 48, 12)
            Dim P As Point = Handler.Koordinaten + Handler.InternePosition
            If Not M.KOS(Spieler, 0) Is Nothing Then
                If Not M.KOS(Spieler, 1) Is Nothing Then
                    If Handler.InVisibleArea(R, True) Then
                        M.KOS(Spieler, 0).KOGesichtsausdruckMalen(0, 10 + P.X, Position.Y - 2 + P.Y, 18, 12)
                    End If
                    R.Y += 12
                    If Handler.InVisibleArea(R, True) Then
                        M.KOS(Spieler, 1).KOGesichtsausdruckMalen(0, 10 + P.X, Position.Y - 2 + 12 + P.Y, 18, 12)
                    End If
                Else
                    R.Height = 24
                    If Handler.InVisibleArea(R, True) Then
                        M.KOS(Spieler, 0).KOGesichtsausdruckMalen(0, 10 + P.X, Position.Y - 2 + P.Y, 12, 24)
                    End If
                End If
            End If
        End Sub
        Private Sub MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
            'Nur der Host darf hier etwas verändern
            If Hauptmenü.NetzConnected Then
                If Hauptmenü.NetzHosten = False Then
                    Exit Sub
                End If
            End If
            e = New System.Windows.Forms.MouseEventArgs(e.Button, e.Clicks, e.X, e.Y, e.Delta)
            For I = 0 To NUDS.Length - 1
                NUDS(I).MouseDown(e.X, e.Y)
            Next
            Update()
        End Sub
        Private Sub MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
            'Nur der Host darf hier etwas verändern
            If Hauptmenü.NetzConnected Then
                If Hauptmenü.NetzHosten = False Then
                    Exit Sub
                End If
            End If
            e = New System.Windows.Forms.MouseEventArgs(e.Button, e.Clicks, e.X, e.Y, e.Delta)
            For I = 0 To NUDS.Length - 1
                NUDS(I).MouseUp(e.X, e.Y)
            Next
            Update()
        End Sub
        Public Sub Update()
            If Not Objektverwalter.Menü Is Nothing Then
                If TypeOf Objektverwalter.Menü Is ObjektKartenauswahlMenü Then
                    Dim M As ObjektKartenauswahlMenü = Objektverwalter.Menü
                    For I = 0 To M.Spielerdaten.Length - 1
                        M.Spielerdaten(I).Update(M)
                    Next
                End If
            End If

        End Sub
        Public Sub Update(ByVal M As ObjektKartenauswahlMenü)
            Dim KIStufe As ObjektSpieler.KIStufen = [Enum].Parse(ObjektSpieler.KIStufen.Einfach.GetType, DDMS(1).GetItem)
            M.KIStufen(Spieler) = KIStufe
            M.Startfonds(Spieler) = NUDS(0).GetValue
            M.FondsproStadt(Spieler) = NUDS(1).GetValue
            M.FondsproFabrik(Spieler) = NUDS(2).GetValue
            Dim I As Objektverwalter.ABC = [Enum].Parse(Objektverwalter.ABC.A.GetType, DDMS(0).GetItem)
            M.Teams(Spieler) = I.ToString
            Dim Item As String = DDMS(2).GetItem
            If Item <> "Ind." Then
                If Item = "Ind 1" Or Item = "Ind 2" Or Item = "Ind 3" Then
                    If Not Hauptmenü.NetzConnected Then
                        Select Case Item.ToUpper
                            Case "IND 1"
                                M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.Custom1))
                            Case "IND 2"
                                M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.Custom2))
                            Case "IND 3"
                                M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.Custom3))
                        End Select
                        EinheitenCheckboxen.UpdateBauliste()
                    End If
                Else
                    Select Case Item.ToUpper
                        Case "AW"
                            M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.AW))
                        Case "AW 2"
                            M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.AW2))
                        Case "AW DS"
                            M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.AWDS))
                        Case "AW DC"
                            M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.AWDC))
                        Case "CW"
                            M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.CoW))
                        Case "CW 2"
                            M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.CoW2))
                        Case Else
                            M.Baulisten(Spieler) = Nothing
                    End Select
                    EinheitenCheckboxen.UpdateBauliste()
                End If
            End If
            Dim AlteTabelle As Color = M.Farbtabellen(Spieler)
            'Wir prüfen das mit der Spielerfarbe
            Dim Farbtabelle As Integer = DDMS(3).IsItemOutOfList
            If Farbtabelle < 0 Then
                M.Farbtabellen(Spieler) = DDMS(3).GetItem
            Else
                M.Farbtabellen(Spieler) = Hauptmenü.AlleFarbtabellen(Farbtabelle)
                If Hauptmenü.NetzConnected Then
                    Hauptmenü.NetzBefehlKartenauswahlSendenFarbe(Spieler, DDMS(3).GetItemNumber)
                End If
            End If
            If Spieler = ObjektKartenauswahlMenü.MomentanerSpieler Then
                If M.Farbtabellen(Spieler) <> AlteTabelle Then
                    M.Farbeändern(M.Farbtabellen(Spieler))
                End If
            End If
            SetNetzzugriff(M)
            'Dürfte das Netz zwar in Anspruch nehmen mal sehen wie gut das klappt
        End Sub
        ''' <summary>
        ''' Entfernt die Handles dieses Objekts
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub RealeseHandles()
            For I = 0 To DDMS.Length - 1
                DDMS(I).RemoveHandles()
            Next
            RemoveHandler Hauptmenü.MainMenü.MouseDown, AddressOf MouseDown
            RemoveHandler Hauptmenü.MainMenü.MouseUp, AddressOf MouseUp
        End Sub
        Public Sub SetDaten(ByVal StartFonds As Integer, ByVal FondsproStadt As Integer, ByVal Fabrikfonds As Integer, ByVal Team As Char, ByVal Bauliste As String)
            NUDS(0).SetValue(StartFonds)
            NUDS(1).SetValue(FondsproStadt)
            NUDS(2).SetValue(Fabrikfonds)
            DDMS(0).SetItem(Team)
            If Bauliste <> "KeineÄnderung" Then
                If Bauliste <> "-1" Then
                    DDMS(2).SetItem(Bauliste)
                End If
            End If
        End Sub
        Public Sub SetTeam(ByVal Team As Char)
            DDMS(0).SetItem(Team)
        End Sub
        Public Sub SetSpielerFarbe(ByVal Farbe As String)
            DDMS(3).SetItem(Farbe)
        End Sub
        Public Sub SetSpielerFarbe(ByVal Farbe As Integer)
            DDMS(3).SetItem(Farbe)
        End Sub
        ''' <summary>
        ''' Darf nur von Einheitencheckbox aufgerufen werden.
        ''' </summary>
        ''' <param name="Liste"></param>
        ''' <remarks></remarks>
        Public Sub SetBauliste(ByVal Liste As String)
            DDMS(2).SetItem(Liste)
            Dim M As ObjektKartenauswahlMenü = Objektverwalter.Menü
            Dim Werte(ObjektKartenauswahlMenü.EinheitenCheckboxen.Checked.Length - 1) As Integer
            Dim Namen(ObjektKartenauswahlMenü.EinheitenCheckboxen.Checked.Length - 1) As String
            For I = 0 To ObjektKartenauswahlMenü.EinheitenCheckboxen.Checked.Length - 1
                If ObjektKartenauswahlMenü.EinheitenCheckboxen.Checked(I) = True Then
                    Werte(I) = 1
                Else
                    Werte(I) = 0
                End If
                Namen(I) = Objektverwalter.AlleEinheiten(I).EinheitenID
            Next
            M.Baulisten(Spieler) = New Bauliste(Werte, Namen)
        End Sub

        Public Function GetKIStufe() As ObjektSpieler.KIStufen
            Return [Enum].Parse(ObjektSpieler.KIStufen.Mensch.GetType, DDMS(1).GetItem)
        End Function
        ''' <summary>
        ''' Legt fest auf welche Objekte wir Zugriff erhalten.
        ''' </summary>
        ''' <remarks></remarks>
        Private Sub SetNetzzugriff(ByVal Menü As ObjektKartenauswahlMenü)
            DDMS(0).SetNetzmodus(False)
            DDMS(1).SetNetzmodus(False)
            DDMS(2).SetNetzmodus(False)
            DDMS(3).SetNetzmodus(False)
            If Hauptmenü.NetzConnected Then
                If Hauptmenü.NetzHosten Then
                    Netzzugriff = True
                    DDMS(0).SetNetzmodus(True)
                    DDMS(1).SetNetzmodus(True)
                    DDMS(2).SetNetzmodus(True)
                    DDMS(3).SetNetzmodus(True)
                Else
                    If GetKIStufe() = ObjektSpieler.KIStufen.Mensch Or GetKIStufe() = ObjektSpieler.KIStufen.Offen Then
                        Netzzugriff = False
                        'Farben darf man selber festlegen.
                        DDMS(3).SetNetzmodus(True)
                        'Teams auch
                        DDMS(0).SetNetzmodus(True)
                        If ObjektSpieler.KIStufen.Offen = GetKIStufe() Then
                            DDMS(1).SetNetzmodus(True)
                        End If
                    Else
                        Netzzugriff = False
                    End If
                End If
            Else
                Netzzugriff = True
                DDMS(0).SetNetzmodus(True)
                DDMS(1).SetNetzmodus(True)
                DDMS(2).SetNetzmodus(True)
                DDMS(3).SetNetzmodus(True)
            End If
        End Sub
        Public Sub SetKIstufe(ByVal Stufe As String)
            DDMS(1).SetItem(Stufe)
        End Sub
        Public Sub ChangeBauliste(ByVal Bauliste As ObjektKartenauswahlMenü.KartenAuswahlBaulisten, ByVal M As ObjektKartenauswahlMenü)
            Select Case Bauliste.ToString.ToUpper
                Case "AW"
                    M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.AW))
                Case "AW2"
                    M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.AW2))
                Case "AWDS"
                    M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.AWDS))
                Case "AWDC"
                    M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.AWDC))
                Case "CW"
                    M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.CoW))
                Case "CW2"
                    M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.CoW2))
                Case "IND1"
                    If Not Hauptmenü.NetzConnected Then M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.Custom1))
                Case "IND2"
                    If Not Hauptmenü.NetzConnected Then M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.Custom2))
                Case "IND3"
                    If Not Hauptmenü.NetzConnected Then M.Baulisten(Spieler) = New Bauliste(ObjektLadeklasse.GetBauliste(Commander_Wars.Baulisten.Custom3))
                Case "Ind."
                    'Wir machen nichts!
                Case Else
                    M.Baulisten(Spieler) = Nothing
            End Select
            EinheitenCheckboxen.UpdateBauliste()
        End Sub
        Public Function GetBauliste() As String
            Return DDMS(2).GetItem
        End Function
        Public Function GetStartfonds() As Integer
            Return NUDS(0).GetValue
        End Function
        Public Function GetFondsproStadt() As Integer
            Return NUDS(1).GetValue
        End Function
        Public Function GetFabrikfonds() As Integer
            Return NUDS(2).GetValue
        End Function
        Public Sub ChangeWindowSize(ByVal PosChange As Point)
            For Each DDM In DDMS
                DDM.ChangeWindowSize(PosChange)
            Next
            For Each NUD In NUDS
                NUD.ChangeWindowSize(PosChange)
            Next
        End Sub
    End Class
    Private Class AlleSpieler
        Dim NUDS() As ObjektNumericUpDown = {}
        Dim DDMS() As ObjektDropDownMenü = {}
        Dim Labels() As ObjektLabel = {}
        Dim Spieler As Integer
        Dim LetzteListe As KartenAuswahlBaulisten = KartenAuswahlBaulisten.CW
        Dim Fonds As Integer = 1000
        Dim Startfonds As Integer = 0
        Dim Fabrikfonds As Integer = 30000
        Dim Handler As ObjektPanel2D
        Public Sub New(ByVal Spieler As Integer, ByVal Menü As ObjektKartenauswahlMenü, ByVal YPos As Integer, ByVal Handler As ObjektPanel2D)
            'Das hier darf nur der Host
            Dim Befehlszugriff As Boolean = True
            If Hauptmenü.NetzConnected Then
                If Hauptmenü.NetzHosten Then
                    Befehlszugriff = True
                Else
                    Befehlszugriff = False
                End If
            Else
                Befehlszugriff = True
            End If
            Me.Handler = Handler
            Me.Spieler = Spieler
            ReDim NUDS(2)
            ReDim DDMS(0)
            ReDim Labels(8)
            Dim Werte() As String = [Enum].GetNames(ObjektSpieler.KIStufen.Mensch.GetType)
            Array.Resize(Werte, Werte.Length - 1)
            '  SUDS(1) = New ObjektStringUpDown(Menü.KIStufen(Spieler), Werte, My.Settings.Resourcenpfad + "Objekte\NUD.png", New Point(Hauptmenü.MainMenü.MalPanel.Width - 450, YPos))
            NUDS(0) = New ObjektNumericUpDown(Menü.Startfonds(Spieler), 0, 99500, My.Settings.Resourcenpfad + "Objekte\NUD.png", New Point(220, YPos), 500, New PointF, , Handler)
            Startfonds = Menü.Startfonds(Spieler)
            NUDS(1) = New ObjektNumericUpDown(Menü.FondsproStadt(Spieler), 500, 99500, My.Settings.Resourcenpfad + "Objekte\NUD.png", New Point(295, YPos), 500, New PointF, , Handler)
            Fonds = Menü.FondsproStadt(Spieler)
            NUDS(2) = New ObjektNumericUpDown(Menü.FondsproFabrik(Spieler), 500, 99500, My.Settings.Resourcenpfad + "Objekte\NUD.png", New Point(370, YPos), 500, New PointF, , Handler)
            Fabrikfonds = Menü.FondsproFabrik(Spieler)
            '   Dim I As Integer = [Enum].Parse(Objektverwalter.ABC.A.GetType, Menü.Teams(Spieler))
            '   SUDS(0) = New ObjektStringUpDown(I, [Enum].GetNames(Objektverwalter.ABC.A.GetType), My.Settings.Resourcenpfad + "Objekte\NUD.png", New Point(Hauptmenü.MainMenü.MalPanel.Width - 100, YPos))
            DDMS(0) = New ObjektDropDownMenü(510, YPos, New String() {"AW", "AW 2", "AW DS", "CW", "AW DC", "CW 2", "Ind 1", "Ind 2", "Ind 3"}, New PointF(1, 1), Befehlszugriff, Handler)
            Select Case My.Settings.CommanderWarsGameMoodus
                Case CommanderWarsGameModi.AdvanceWars
                    DDMS(0).SetItem(KartenAuswahlBaulisten.AW.ToString)
                Case CommanderWarsGameModi.AdvanceWars2
                    DDMS(0).SetItem("AW 2")
                Case CommanderWarsGameModi.AdvanceWarsDS
                    DDMS(0).SetItem("AW DS")
                Case CommanderWarsGameModi.AdvanceWarsDC
                    DDMS(0).SetItem("AW DC")
                Case CommanderWarsGameModi.CommanderWars2
                    DDMS(0).SetItem("CW 2")
                Case Else
                    DDMS(0).SetItem(KartenAuswahlBaulisten.CW.ToString)
            End Select

            Labels(0) = New ObjektLabel(110, YPos + 30, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"KI Stärke"}, New Point(0, 0), 10, 0, New PointF, Handler)
            Labels(1) = New ObjektLabel(220, YPos + 30, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Fonds"}, New Point(0, 0), 10, 0, New PointF, Handler)
            Labels(2) = New ObjektLabel(295, YPos + 30, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Einkommen"}, New Point(0, 0), 10, 0, New PointF, Handler)
            Labels(3) = New ObjektLabel(370, YPos + 30, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Fabrik"}, New Point(0, 0), 10, 0, New PointF, Handler)
            Labels(4) = New ObjektLabel(450, YPos + 30, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Team"}, New Point(0, 0), 10, 0, New PointF, Handler)
            Labels(5) = New ObjektLabel(150, YPos, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Alle"}, New Point(0, 0), 10, 0, New PointF, Handler)
            Labels(6) = New ObjektLabel(510, YPos + 30, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Liste"}, New Point(0, 0), 10, 0, New PointF, Handler)
            Labels(7) = New ObjektLabel(70, YPos + 30, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Farbe"}, New Point(0, 0), 10, 0, New PointF, Handler)
            Labels(8) = New ObjektLabel(10, YPos + 30, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"KO's"}, New Point(0, 0), 10, 0, New PointF, Handler)

            'Handler hinzufügen
            AddHandler Hauptmenü.MainMenü.MalPanel.MouseDown, AddressOf MouseDown
            AddHandler Hauptmenü.MainMenü.MalPanel.MouseUp, AddressOf MouseUp
        End Sub
        Public Sub Malen()
            For I = 0 To NUDS.Length - 1
                NUDS(I).Malen()
            Next
            For I = 0 To Labels.Length - 1
                Labels(I).Malen()
            Next

        End Sub
        Private Sub MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
            'Nur der Host darf hier etwas verändern
            If Hauptmenü.NetzConnected Then
                If Hauptmenü.NetzHosten = False Then
                    Exit Sub
                End If
            End If
            e = New System.Windows.Forms.MouseEventArgs(e.Button, e.Clicks, e.X, e.Y, e.Delta)
            For I = 0 To NUDS.Length - 1
                NUDS(I).MouseDown(e.X, e.Y)
            Next
            Update()
        End Sub
        Private Sub MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
            'Nur der Host darf hier etwas verändern
            If Hauptmenü.NetzConnected Then
                If Hauptmenü.NetzHosten = False Then
                    Exit Sub
                End If
            End If
            e = New System.Windows.Forms.MouseEventArgs(e.Button, e.Clicks, e.X, e.Y, e.Delta)
            For I = 0 To NUDS.Length - 1
                NUDS(I).MouseUp(e.X, e.Y)
            Next
            Update()
        End Sub
        Private Sub Update()
            If Not Objektverwalter.Menü Is Nothing Then
                If TypeOf Objektverwalter.Menü Is ObjektKartenauswahlMenü Then
                    Dim M As ObjektKartenauswahlMenü = Objektverwalter.Menü
                    Dim Liste As String = "KeineÄnderung"
                    Dim AlteListe As String = "AW"
                    Select Case LetzteListe
                        Case KartenAuswahlBaulisten.AW
                            AlteListe = "AW"
                        Case KartenAuswahlBaulisten.AW2
                            AlteListe = "AW 2"
                        Case KartenAuswahlBaulisten.AWDS
                            AlteListe = "AW DS"
                        Case KartenAuswahlBaulisten.CW
                            AlteListe = "CW"
                        Case KartenAuswahlBaulisten.AWDC
                            AlteListe = "AW DC"
                        Case KartenAuswahlBaulisten.CW2
                            AlteListe = "CW 2"
                        Case KartenAuswahlBaulisten.Eigene1
                            AlteListe = "IND 1"
                        Case KartenAuswahlBaulisten.Eigene2
                            AlteListe = "IND 2"
                        Case KartenAuswahlBaulisten.Eigene3
                            AlteListe = "IND 3"
                    End Select
                    If AlteListe.ToUpper = DDMS(0).GetItem.ToString.ToUpper Then
                        Liste = "KeineÄnderung"
                    Else
                        Liste = DDMS(0).GetItem
                        Select Case Liste
                            Case "AW"
                                LetzteListe = KartenAuswahlBaulisten.AW
                            Case "AW 2"
                                LetzteListe = KartenAuswahlBaulisten.AW2
                            Case "AW DS"
                                LetzteListe = KartenAuswahlBaulisten.AWDS
                            Case "CW"
                                LetzteListe = KartenAuswahlBaulisten.CW
                            Case "CW 2"
                                LetzteListe = KartenAuswahlBaulisten.CW2
                            Case "AW DC"
                                LetzteListe = KartenAuswahlBaulisten.AWDC
                            Case "IND 1"
                                LetzteListe = KartenAuswahlBaulisten.Eigene1
                            Case "IND 2"
                                LetzteListe = KartenAuswahlBaulisten.Eigene1
                            Case "IND 3"
                                LetzteListe = KartenAuswahlBaulisten.Eigene3
                        End Select
                    End If
                    Dim UpdateStartfonds As Boolean = False
                    Dim UpdateFonds As Boolean = False
                    Dim UpdateFabrikfonds As Boolean = False
                    If Startfonds <> NUDS(0).GetValue Then
                        UpdateStartfonds = True
                    End If
                    If NUDS(1).GetValue <> Fonds Then
                        UpdateFonds = True
                    End If
                    If NUDS(2).GetValue <> Fabrikfonds Then
                        UpdateFabrikfonds = True
                    End If
                    For I = 0 To M.Spielerdaten.Length - 1
                        Dim NeuStartFonds As Integer = M.Spielerdaten(I).GetStartfonds
                        Dim NeuFondsproStadt As Integer = M.Spielerdaten(I).GetFondsproStadt
                        Dim NeuFabrikfonds As Integer = M.Spielerdaten(I).GetFabrikfonds
                        If UpdateStartfonds Then
                            NeuStartFonds = NUDS(0).GetValue
                            Startfonds = NUDS(0).GetValue
                        End If
                        If UpdateFonds Then
                            NeuFondsproStadt = NUDS(1).GetValue
                            Fonds = NUDS(1).GetValue
                        End If
                        If UpdateFabrikfonds Then
                            NeuFabrikfonds = NUDS(2).GetValue
                            Fabrikfonds = NUDS(2).GetValue
                        End If
                        M.Spielerdaten(I).SetDaten(NeuStartFonds, NeuFondsproStadt, NeuFabrikfonds, M.Teams(I + 1), Liste)
                    Next



                    For I = 0 To M.Spielerdaten.Length - 1
                        M.Spielerdaten(I).Update(M)
                    Next
                End If
            End If
        End Sub
        ''' <summary>
        ''' Entfernt die Handles dieses Objekts
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub RealeseHandles()
            For I = 0 To DDMS.Length - 1
                DDMS(I).RemoveHandles()
            Next
            RemoveHandler Hauptmenü.MainMenü.MalPanel.MouseDown, AddressOf MouseDown
            RemoveHandler Hauptmenü.MainMenü.MalPanel.MouseUp, AddressOf MouseUp
        End Sub
        Public Sub ChangeWindowSize(ByVal PosChange As Point)
            For Each DDM In DDMS
                DDM.ChangeWindowSize(PosChange)
            Next
            For Each NUD In NUDS
                NUD.ChangeWindowSize(PosChange)
            Next
            For Each Label In Labels
                Label.ChangeWindowSize(PosChange)
            Next
        End Sub
    End Class
#End Region
    ''' <summary>
    ''' Verändert die Anzeige Farben und so bei der Spielerauswahl
    ''' </summary>
    ''' <param name="Spieler"></param>
    ''' <remarks></remarks>
    Private Sub ChangePlayer(ByVal Spieler As Integer)
        bStartbereitShowButtons = False
        MomentanerSpieler = Spieler
        If EinheitenCheckboxen Is Nothing Then
            EinheitenCheckboxen.NeueFarbtabelle(New ObjektSpieler(MomentanerSpieler, Farbtabellen(MomentanerSpieler), 0, Nothing, 0, "", "", Nothing, ObjektSpieler.KIStufen.Mensch, 0), Farbtabellen(MomentanerSpieler))
        End If
        KOAnzeigeTexturenKaden(Farbtabellen(MomentanerSpieler))
    End Sub
    ''' <summary>
    ''' Wir verändern ein paar Daten.;)
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub UpdateSpielerAuswahl()
        If Not DropDownMenüs(0) Is Nothing Then
            If DropDownMenüs(0).GetItem <> MomentanerSpieler Then
                ChangePlayer(DropDownMenüs(0).GetItem)
            End If
        End If
        Updateframe += 1
        If Updateframe > 10 Then
            For I = 0 To Spielerdaten.Length - 1
                Spielerdaten(I).Update(Me)
            Next
            Updateframe = 0
            For I = 0 To Spielerdaten.Length - 1
                SendPlayerInformation(I + 1)
            Next
            If Hauptmenü.NetzConnected And Hauptmenü.NetzHosten Then
                Hauptmenü.NetzBefehlKartenauswahlSendenUpdateBeendet()
            End If
            If Hauptmenü.NetzConnected Then
                For I = 0 To Spielerdaten.Length - 1
                    Spielerdaten(I).SetDaten(Startfonds(I + 1), FondsproStadt(I + 1), FondsproFabrik(I + 1), Teams(I + 1), -1)
                Next
            End If
        End If
    End Sub
    Protected Function SpielBereit() As Boolean
        Dim Spieler As Integer = KIStufen.Length - 1
        For I = 0 To KIStufen.Length - 1
            If KIStufen(I) <> ObjektSpieler.KIStufen.Geschlossen Then
                If KOS(I, 0) Is Nothing Then
                    Return False
                ElseIf KIStufen(I) = ObjektSpieler.KIStufen.Offen Then
                    Return False
                End If
            Else
                Spieler -= 1
            End If
        Next
        If Spieler >= 2 Then
            Return True
        Else
            Return False
        End If
    End Function
    ''' <summary>
    ''' Wählt die Spieler durch.
    ''' </summary>
    ''' <param name="Richtung"></param>
    ''' <remarks></remarks>
    Protected Sub NextPlayer(ByVal Richtung As Integer)
        Dim MomItem As Integer = DropDownMenüs(0).GetItemNumber
        If MomItem >= 0 Then
            If MomItem + Richtung < DropDownMenüs(0).GetItemZahl And MomItem + Richtung >= 0 Then
                DropDownMenüs(0).SetItem(MomItem + Richtung)
            Else
                DropDownMenüs(0).SetItem(MomItem)
            End If
        Else
            DropDownMenüs(0).SetItem(0)
        End If
        If MomItem + Richtung >= DropDownMenüs(0).GetItemZahl - 1 Then
            LöschenButton("Weiter")
            bStartbereitShowButtons = False
            CheckButtonStarten()
        ElseIf MomItem = DropDownMenüs(0).GetItemZahl - 1 And Richtung < 0 Then
            LöschenButton("Bereit")
            LöschenButton("Starten")
            bStartbereitShowButtons = False
            NeuButton(Hauptmenü.MainMenü.MalPanel.Width - 138, Hauptmenü.MainMenü.MalPanel.Height - 30, My.Settings.Resourcenpfad + "Objekte\Button.png", "Weiter", New PointF(1, 1))
        End If

    End Sub
    Protected Sub CheckButtonStarten()
        If KAModus = KAModi.SpielerAuswahl Then
            If bStartbereitShowButtons Then  'Wenn die Buttons schon angezeigt werden, müssen wir sie nicht nochmal anzeigen :)
                If Not SpielBereit() Then
                    If Hauptmenü.NetzConnected Then
                        LöschenButton("Bereit")
                    Else
                        LöschenButton("Starten")
                    End If
                    bStartbereitShowButtons = False
                End If
            Else
                If SpielBereit() Then
                    If DropDownMenüs.Length > 0 Then
                        If Not DropDownMenüs(0) Is Nothing Then
                            If Hauptmenü.NetzConnected Then
                                LöschenButton("Bereit")
                            Else
                                LöschenButton("Starten")
                            End If
                            If DropDownMenüs(0).GetItemNumber >= DropDownMenüs(0).GetItemZahl - 1 Then 'OK, wir haben den letzten Spieler ausgewählt.
                                If Hauptmenü.NetzConnected Then ' And Not Hauptmenü.NetzHosten Then
                                    NeuButton(Hauptmenü.MainMenü.MalPanel.Width - 138, Hauptmenü.MainMenü.MalPanel.Height - 30, My.Settings.Resourcenpfad + "Objekte\Button.png", "Bereit", New PointF(1, 1))
                                Else
                                    NeuButton(Hauptmenü.MainMenü.MalPanel.Width - 138, Hauptmenü.MainMenü.MalPanel.Height - 30, My.Settings.Resourcenpfad + "Objekte\Button.png", "Starten", New PointF(1, 1))
                                End If
                                bStartbereitShowButtons = True
                            Else
                                LöschenButton("Weiter")
                                NeuButton(Hauptmenü.MainMenü.MalPanel.Width - 138, Hauptmenü.MainMenü.MalPanel.Height - 30, My.Settings.Resourcenpfad + "Objekte\Button.png", "Weiter", New PointF(1, 1))
                                If Hauptmenü.NetzConnected Then ' And Not Hauptmenü.NetzHosten Then
                                    NeuButton(Hauptmenü.MainMenü.MalPanel.Width - 138, Hauptmenü.MainMenü.MalPanel.Height - 60, My.Settings.Resourcenpfad + "Objekte\Button.png", "Bereit", New PointF(1, 1))
                                Else
                                    NeuButton(Hauptmenü.MainMenü.MalPanel.Width - 138, Hauptmenü.MainMenü.MalPanel.Height - 60, My.Settings.Resourcenpfad + "Objekte\Button.png", "Starten", New PointF(1, 1))
                                End If
                                bStartbereitShowButtons = True
                            End If
                        End If
                    End If
                End If
            End If
        End If
    End Sub
#End Region
#Region "RegelAuswahl"
    Dim LastGameModus As CommanderWarsGameModi
    ''' <summary>
    ''' Hier wird der Regelauswahl Bildschirm erstellt
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub RegelnFestlegen()
        If Objektverwalter.Minimap IsNot Nothing Then
            Objektverwalter.Minimap.Wirdgemalt = False
        End If
        ResetKartenAuswahl()
        'Die Knöpfe werden auf Weiter und Zurück reduziert.
        LöschenButton("Spielerfarbe")
        LöschenButton("Zufallskarte")

        ReDim Labels(18)
        ReDim NUDS(3)
        ReDim SUDS(0)
        ReDim MultiValues(0)
        ReDim CheckBoxen(6)
        ReDim DropDownMenüs(1)

        Dim P As New ObjektPanel2D(New Rectangle(0, 0, Hauptmenü.MainMenü.MalPanel.Width, Hauptmenü.MainMenü.MalPanel.Height), New PointF(1, 1), 1, False)
        'Wir erschaffen die 4 Label mit den Wetterarten
        'Sonne
        Labels(0) = New ObjektLabel(30, 30, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Sonne"}, New Point, 10, 0, New PointF(), P)
        'Regen
        Labels(1) = New ObjektLabel(30, 50, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Regen"}, New Point, 10, 0, New PointF(), P)
        'Schnee
        Labels(2) = New ObjektLabel(30, 70, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Schnee"}, New Point, 10, 0, New PointF(), P)
        'Sandsturm
        Labels(3) = New ObjektLabel(30, 90, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Sandsturm"}, New Point, 10, 0, New PointF(), P)
        'Der Multivalue für das Wetter wird erschaffen
        MultiValues(0) = New ObjektMultiValue(0, 100, 4, New Point(100, 30), 100, 20, New PointF, P)
        'Die Values erhalten die Standardwerte der Karte
        For I = 0 To 3
            MultiValues(0).SetValue(I, SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.Wetterwahrscheinlichkeiten(I), False)
        Next


        'Der Kriegsnebel

        Labels(4) = New ObjektLabel(30, 260, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Kriegsnebel"}, New Point, 10, 0, New PointF(), P)
        Labels(11) = New ObjektLabel(30, 160, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Luftschlacht"}, New Point, 10, 0, New PointF(), P)
        SUDS(0) = New ObjektStringUpDown(SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.Nebel, [Enum].GetNames(Nebelarten.Aus.GetType), My.Settings.Resourcenpfad + "Objekte\NUD.png", New Point(110, 260), New PointF(), P)
        'So jetzt erstellen wir die Anzeige für die Siegbedingungen und ihre Startwerte geladen
        Labels(5) = New ObjektLabel(300, 30, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Siegbedingungen"}, New Point, 16, 0, New PointF(), P)
        Labels(6) = New ObjektLabel(300, 60, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Keine HQS"}, New Point, 10, 0, New PointF(), P)
        Labels(7) = New ObjektLabel(300, 80, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Keine Einheiten"}, New Point, 10, 0, New PointF(), P)
        Labels(8) = New ObjektLabel(300, 100, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Keine Besetzungen"}, New Point, 10, 0, New PointF(), P)
        Labels(9) = New ObjektLabel(300, 120, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Zeit"}, New Point, 10, 0, New PointF())
        Labels(10) = New ObjektLabel(300, 140, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Besetzungen"}, New Point, 10, 0, New PointF(), P)
        CheckBoxen(0) = New ObjektCheckBox(New Point(420, 60), "CheckBox", New PointF, , P)
        If SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.StandartSiegbedingungen.Contains(ObjektRegeln.Siegbedingungen.KeineHQs) Then CheckBoxen(0).Checked = True Else CheckBoxen(0).Checked = False
        CheckBoxen(1) = New ObjektCheckBox(New Point(420, 80), "CheckBox", New PointF, , P)
        If SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.StandartSiegbedingungen.Contains(ObjektRegeln.Siegbedingungen.KeineEinheiten) Then CheckBoxen(1).Checked = True Else CheckBoxen(1).Checked = False
        CheckBoxen(2) = New ObjektCheckBox(New Point(420, 100), "CheckBox", New PointF, , P)
        If SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.StandartSiegbedingungen.Contains(ObjektRegeln.Siegbedingungen.KeineBesetzungen) Then CheckBoxen(2).Checked = True Else CheckBoxen(2).Checked = False
        'CheckBox Luftschlacht
        CheckBoxen(3) = New ObjektCheckBox(New Point(150, 160), "CheckBox", New PointF, SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.Luftschlacht, P)



        NUDS(0) = New ObjektNumericUpDown(0, 0, 9999, My.Settings.Resourcenpfad + "Objekte\NUD.png", New Point(420, 120), 1, New PointF(), 0, P)
        If SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.StandartSiegbedingungen.Contains(ObjektRegeln.Siegbedingungen.Zeit) Then
            NUDS(0).SetValue(SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.MaxSpieldauer)
        Else
            NUDS(0).SetValue(-1)
        End If

        Dim Min As Integer = SpielKarten(AngezeigteKarten(MomentaneKarte)).CalculateMinGebäudeFürSieg

        NUDS(1) = New ObjektNumericUpDown(Min, Min, 9999, My.Settings.Resourcenpfad + "Objekte\NUD.png", New Point(420, 140), 1, New PointF(), Min, P)
        If SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.StandartSiegbedingungen.Contains(ObjektRegeln.Siegbedingungen.Besetzungen) Then
            NUDS(1).SetValue(SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.MaximaleanzahlderBesetzungen)
        Else
            NUDS(1).SetValue(-1)
        End If
        'Rang
        Labels(12) = New ObjektLabel(30, 180, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Rang System"}, New Point, 10, 0, New PointF(), P)
        CheckBoxen(4) = New ObjektCheckBox(New Point(150, 180), "CheckBox", New PointF, SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.LevelModus, P)
        'Spielmodus
        Labels(13) = New ObjektLabel(30, 200, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Spielmodus"}, New Point, 10, 0, New PointF(), P)
        DropDownMenüs(0) = New ObjektDropDownMenü(150, 200, New String() {"Advance Wars", "Advance Wars 2", "Advance Wars DS", "Commander Wars", "Advance Wars DC", "Commander Wars 2"}, New PointF, , P)
        DropDownMenüs(0).SetItem(My.Settings.CommanderWarsGameMoodus)
        LastGameModus = My.Settings.CommanderWarsGameMoodus
        'Startspieler...
        Labels(14) = New ObjektLabel(30, 230, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Startspieler"}, New Point, 10, 0, New PointF(), P)
        NUDS(2) = New ObjektNumericUpDown(1, 1, KIStufen.Length - 1, My.Settings.Resourcenpfad + "Objekte\NUD.png", New Point(150, 230), 1, New PointF(), , P)
        'Standardwetter
        Labels(15) = New ObjektLabel(30, 110, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Standardwetter"}, New Point, 10, 0, New PointF(), P)
        DropDownMenüs(1) = New ObjektDropDownMenü(150, 110, [Enum].GetNames(ObjektSpielfeld.Wetterarten.Regen.GetType), New PointF, , P)
        DropDownMenüs(1).SetItem(SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.Standardwetter)
        Labels(16) = New ObjektLabel(30, 135, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Zufallswetter"}, New Point, 10, 0, New PointF(), P)
        CheckBoxen(5) = New ObjektCheckBox(New Point(150, 135), "CheckBox", New PointF, SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.Zufallswetter, P)

        Labels(17) = New ObjektLabel(30, 285, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Baublockade"}, New Point, 10, 0, New PointF(), P)
        CheckBoxen(6) = New ObjektCheckBox(New Point(150, 285), "CheckBox", New PointF, SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.BauBlockade, P)

        Labels(18) = New ObjektLabel(30, 310, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Teuerungsrate"}, New Point, 10, 0, New PointF(), P)
        NUDS(3) = New ObjektNumericUpDown(SpielKarten(AngezeigteKarten(MomentaneKarte)).Regeln.Teurungsrate, 0, 10000, My.Settings.Resourcenpfad + "Objekte\NUD.png", New Point(150, 310), 100, New PointF(), -1, P)

    End Sub
    Private Sub CreateRegeln()

        Dim Siegbedingungen As ObjektRegeln.Siegbedingungen() = {}
        If CheckBoxen(0).Checked = True Then
            Array.Resize(Siegbedingungen, Siegbedingungen.Length + 1)
            Siegbedingungen(Siegbedingungen.Length - 1) = ObjektRegeln.Siegbedingungen.KeineHQs
        End If
        If CheckBoxen(1).Checked = True Then
            Array.Resize(Siegbedingungen, Siegbedingungen.Length + 1)
            Siegbedingungen(Siegbedingungen.Length - 1) = ObjektRegeln.Siegbedingungen.KeineEinheiten
        End If
        If CheckBoxen(2).Checked = True Then
            Array.Resize(Siegbedingungen, Siegbedingungen.Length + 1)
            Siegbedingungen(Siegbedingungen.Length - 1) = ObjektRegeln.Siegbedingungen.KeineBesetzungen
        End If
        Dim Nebel As Nebelarten = [Enum].Parse(Nebelarten.Kriegsnebel.GetType, SUDS(0).GetValue)
        Dim W As ObjektSpielfeld.Wetterarten = DropDownMenüs(1).GetItemNumber
        Regeln = New ObjektRegeln(Nebel, SpielKarten(AngezeigteKarten(MomentaneKarte)).Spieler.Length - 1, Siegbedingungen, True, New Integer() {MultiValues(0).GetValue(0), MultiValues(0).GetValue(1), MultiValues(0).GetValue(2), MultiValues(0).GetValue(3)}, W, NUDS(0).GetValue, NUDS(1).GetValue, , , , CheckBoxen(3).Checked)

        If CheckBoxen(4).Checked Then
            Regeln.LevelModus = True
        Else
            Regeln.LevelModus = False
        End If
        'Wir schauen nach dem Spielmodus
        Dim AlterModus As Integer = My.Settings.CommanderWarsGameMoodus
        Select Case DropDownMenüs(0).GetItem
            Case "Advance Wars"
                My.Settings.CommanderWarsGameMoodus = CommanderWarsGameModi.AdvanceWars
            Case "Advance Wars 2"
                My.Settings.CommanderWarsGameMoodus = CommanderWarsGameModi.AdvanceWars2
            Case "Advance Wars DS"
                My.Settings.CommanderWarsGameMoodus = CommanderWarsGameModi.AdvanceWarsDS
            Case "Commander Wars"
                My.Settings.CommanderWarsGameMoodus = CommanderWarsGameModi.CommanderWars
            Case "Advance Wars DC"
                My.Settings.CommanderWarsGameMoodus = CommanderWarsGameModi.AdvanceWarsDC
            Case "Commander Wars 2"
                My.Settings.CommanderWarsGameMoodus = CommanderWarsGameModi.CommanderWars2
            Case Else
                My.Settings.CommanderWarsGameMoodus = CommanderWarsGameModi.CommanderWars
        End Select
        If My.Settings.CommanderWarsGameMoodus <> AlterModus Then
            'wir müssen die neuen Texturen holen.
            Objektverwalter.LoadNewGameModus(My.Settings.TerrainStyle)
        End If
        StartSpieler = NUDS(2).GetValue
        'Zufallswetter
        Regeln.Zufallswetter = CheckBoxen(5).Checked
        'Baublockade
        Regeln.BauBlockade = CheckBoxen(6).Checked
        'Teuerungsrate
        Regeln.Teurungsrate = NUDS(3).GetValue
    End Sub
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="Vorwärts">wenn true wird die Zufallskarte gelöscht</param>
    ''' <remarks></remarks>
    Private Sub ResetRegelAuswahl(ByVal Vorwärts As Boolean)
        ReDim NUDS(-1)
        ReDim SUDS(-1)
        ReDim Labels(-1)
        ReDim MultiValues(-1)
        ReDim CheckBoxen(-1)
        For I = 0 To DropDownMenüs.Length - 1
            DropDownMenüs(I).RemoveHandles()
        Next
        ReDim DropDownMenüs(-1)
        For Each P In Panels
            P.RemoveHandles()
        Next
        ReDim Panels(-1)
        If Vorwärts = False Then
            'Zufallskarte löschen.
            Array.Resize(SpielKarten, Kartenname.Length)
        End If
    End Sub
    ''' <summary>
    ''' Kleines Update bei Spielmodus wechsel!
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub UpdateRegeln()
        If LastGameModus <> DropDownMenüs(0).GetItemNumber Then
            LastGameModus = DropDownMenüs(0).GetItemNumber
            Select Case LastGameModus
                Case CommanderWarsGameModi.AdvanceWarsDC
                    'Baublockade
                    CheckBoxen(6).Checked = False
                    'Teurungsrate
                    NUDS(3).SetValue(0)
                    'Rang Modus
                    CheckBoxen(4).Checked = True
                    'Luftschlacht
                    CheckBoxen(3).Checked = False
                Case CommanderWarsGameModi.AdvanceWars, CommanderWarsGameModi.AdvanceWars2, CommanderWarsGameModi.AdvanceWarsDS
                    'Baublockade
                    CheckBoxen(6).Checked = False
                    'Teurungsrate
                    NUDS(3).SetValue(0)
                    'Rang Modus
                    CheckBoxen(4).Checked = False
                    'Luftschlacht
                    CheckBoxen(3).Checked = False
                Case CommanderWarsGameModi.CommanderWars
                    'Baublockade
                    CheckBoxen(6).Checked = False
                    'Teurungsrate
                    NUDS(3).SetValue(0)
                    'Rang Modus
                    CheckBoxen(4).Checked = True
                    'Luftschlacht
                    CheckBoxen(3).Checked = True
                Case CommanderWarsGameModi.CommanderWars2
                    'Baublockade
                    CheckBoxen(6).Checked = True
                    'Teurungsrate
                    NUDS(3).SetValue(100)
                    'Rang Modus
                    CheckBoxen(4).Checked = True
                    'Luftschlacht
                    CheckBoxen(3).Checked = False
            End Select
        End If
    End Sub
#End Region
#Region "Zufallskarte"
    Dim LastVektor As Integer
    Public Sub CreateZufallskartenMenü()
        ResetKartenAuswahl()
        MomentaneKarte = 0
        AngezeigteKarten(0) = 0
        KAModus = KAModi.Zufallskarte
        ReDim Textboxen(0)
        ReDim Labels(5)
        ReDim CheckBoxen(1)
        ReDim NUDS(2)

        Dim MainPanel As New ObjektPanel2D(New Rectangle(0, 0, Hauptmenü.MainMenü.MalPanel.Width, Hauptmenü.MainMenü.MalPanel.Height - 200), New PointF(1, 1), 1, False)

        'Zufallsstartzahl
        Labels(0) = New ObjektLabel(10, 50, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Zufallszahl"}, New Point(0, 0), 10, 0, New PointF, MainPanel)
        Textboxen(0) = New ObjektTextbox(150, 50, 120, New PointF, MainPanel)

        'Zufallskarte zeigen?
        Labels(1) = New ObjektLabel(10, 75, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Minimap"}, New Point(0, 0), 10, 0, New PointF, MainPanel)
        CheckBoxen(0) = New ObjektCheckBox(New Point(150, 75), "CheckBox", New PointF, False, MainPanel)

        'Spieler
        Labels(2) = New ObjektLabel(10, 100, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Spieler"}, New Point(0, 0), 10, 0, New PointF, MainPanel)
        NUDS(0) = New ObjektNumericUpDown(2, 2, 100, My.Settings.Resourcenpfad + "Objekte\NUD.png", New Point(150, 100), 1, New PointF(), 0, MainPanel)
        'Breite 
        Labels(3) = New ObjektLabel(10, 125, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Breite"}, New Point(0, 0), 10, 0, New PointF, MainPanel)
        NUDS(1) = New ObjektNumericUpDown(20, 3, 9999, My.Settings.Resourcenpfad + "Objekte\NUD.png", New Point(150, 125), 1, New PointF(), 0, MainPanel)
        'Höhe
        Labels(4) = New ObjektLabel(10, 150, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Höhe"}, New Point(0, 0), 10, 0, New PointF, MainPanel)
        NUDS(2) = New ObjektNumericUpDown(20, 3, 9999, My.Settings.Resourcenpfad + "Objekte\NUD.png", New Point(150, 150), 1, New PointF(), 0, MainPanel)
        'Straße
        Labels(5) = New ObjektLabel(10, 175, My.Settings.Resourcenpfad + "Objekte\Transparent.png", New String() {"Straße"}, New Point(0, 0), 10, 0, New PointF, MainPanel)
        CheckBoxen(1) = New ObjektCheckBox(New Point(150, 175), "CheckBox", New PointF, True, MainPanel)
        'Generieren Button
        NeuButton(20, 200, My.Settings.Resourcenpfad + "Objekte\Button.png", "Nächste Karte", New PointF, , , , MainPanel)
        NeuButton(20, 230, My.Settings.Resourcenpfad + "Objekte\Button.png", "Generieren", New PointF, , , , MainPanel)
        'Neue Karte erstellen
        LastVektor = CreateRandomMap(20, 20, 2, True)
        Textboxen(0).SetText(LastVektor)
    End Sub
    ''' <summary>
    ''' Erstellt eine Zufallskarte mit den vorgegebenen Zahlen
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub CreateRandomMap()
        UpdateZufallskarte()
        LastVektor = Textboxen(0).GetText
        LastVektor = CreateRandomMap(NUDS(1).GetValue, NUDS(2).GetValue, NUDS(0).GetValue, CheckBoxen(1).Checked, LastVektor)
    End Sub
    Private Function CreateRandomMap(ByVal Breite As Integer, ByVal Höhe As Integer, ByVal Spieler As Integer, ByVal Straße As Boolean, Optional ByVal Startvektor As Integer = -1) As Integer
        Dim SVektor As Integer = Objektverwalter.ZufallskarteV2(Breite, Höhe, GetNeueSpieler(Spieler), New ObjektRegeln(Spieler, False), Straße, Startvektor)
        Objektverwalter.Spielfeld.Kartenname = "Random Map"
        SpielKarten(0) = Objektverwalter.Spielfeld
        Kartenname(0) = "Auto-Zufallskarte"
        Objektverwalter.Spielfeld = Nothing
        FestlegenDerKarte(0)
        Objektverwalter.Minimap = New ObjektMinimap(ObjektMinimap.Texturen, ObjektMinimap.Beschreibung, Objektverwalter.Minimap.SpielerTextur, ObjektMinimap.NeutraleTexturen, SpielKarten(0), New Point(400, 100))
        Objektverwalter.Minimap.Wirdgemalt = CheckBoxen(0).Checked
        ReDim GebäudeZahl(10)
        For I = 0 To GebäudeZahl.Length - 1
            Select Case I
                Case 0
                    GebäudeZahl(0).Y = Objektverwalter.GebäudeTextur.GetGebäudeID("STADT")
                Case 1
                    GebäudeZahl(1).Y = Objektverwalter.GebäudeTextur.GetGebäudeID("BASIS")
                Case 2
                    GebäudeZahl(2).Y = Objektverwalter.GebäudeTextur.GetGebäudeID("WERFT")
                Case 3
                    GebäudeZahl(3).Y = Objektverwalter.GebäudeTextur.GetGebäudeID("FLUGHAFEN")
                Case 4
                    GebäudeZahl(4).Y = Objektverwalter.GebäudeTextur.GetGebäudeID("PIPESTATION")
                Case 5
                    GebäudeZahl(5).Y = Objektverwalter.GebäudeTextur.GetGebäudeID("LABOR")
                Case 6
                    GebäudeZahl(6).Y = Objektverwalter.GebäudeTextur.GetGebäudeID("HQ")
                Case 7
                    GebäudeZahl(7).Y = Objektverwalter.GebäudeTextur.GetGebäudeID("TURM")
                Case 8
                    GebäudeZahl(8).Y = Objektverwalter.GebäudeTextur.GetGebäudeID("MINE")
                Case 9
                    GebäudeZahl(9).Y = Objektverwalter.GebäudeTextur.GetGebäudeID("RAKETENSILO+RAKETE")
                Case 10
                    GebäudeZahl(10).Y = Objektverwalter.GebäudeTextur.GetGebäudeID("RADAR")
            End Select
        Next

        Dim S As ObjektSpielfeld = SpielKarten(AngezeigteKarten(MomentaneKarte))
        For I = 0 To S.Landschaften.GetLength(2) - 1
            For X = 0 To S.Breite - 1
                For Y = 0 To S.Höhe - 1
                    Dim G As ObjektGebäude = S.Landschaften(X, Y, I).Gebäude
                    If Not G Is Nothing Then
                        Select Case G.GebäudeID
                            Case "STADT"
                                GebäudeZahl(0).X += 1
                            Case "BASIS"
                                GebäudeZahl(1).X += 1
                            Case "WERFT"
                                GebäudeZahl(2).X += 1
                            Case "FLUGHAFEN"
                                GebäudeZahl(3).X += 1
                            Case "PIPESTATION"
                                GebäudeZahl(4).X += 1
                            Case "LABOR"
                                GebäudeZahl(5).X += 1
                            Case "HQ"
                                GebäudeZahl(6).X += 1
                            Case "TURM"
                                GebäudeZahl(7).X += 1
                            Case "MINE"
                                GebäudeZahl(8).X += 1
                            Case "RAKETENSILO+RAKETE"
                                GebäudeZahl(9).X += 1
                            Case "RADAR"
                                GebäudeZahl(10).X += 1
                        End Select
                    End If
                Next
            Next
        Next
        Return SVektor
    End Function
    Private Sub ResetZufallsMenü()
        If LastVektor <> Textboxen(0).GetText Then
            CreateRandomMap()
        End If
        For Each T In Textboxen
            T.RemoveHandles()
        Next
        ReDim Textboxen(-1)
        ReDim Labels(-1)
        ReDim NUDS(-1)
        ReDim CheckBoxen(-1)
        LöschenButton("Generieren")
        LöschenButton("Nächste Karte")
        Objektverwalter.Minimap.Wirdgemalt = False
    End Sub
    Public Function GetNeueSpieler(ByVal Spieler As Integer) As ObjektSpieler()
        Dim neuSpieler(Spieler) As ObjektSpieler
        Dim KOS(1) As ObjektKO
        neuSpieler(0) = New ObjektSpieler(0, Hauptmenü.SpielerNeutral, 0, KOS, 0, Commander_Wars.Armeen.OS.ToString, "", Nothing, ObjektSpieler.KIStufen.Kinderleicht, 0)
        Dim AnzahlderArmeen As Integer = [Enum].GetNames(Commander_Wars.Armeen.AC.GetType).Length - 1
        For I = 0 To Spieler - 1
            Dim Farbe As Color
            Dim I2 As Integer = I
            While I2 > Hauptmenü.AlleFarbtabellen.Length - 1
                I2 -= Hauptmenü.AlleFarbtabellen.Length - 1
            End While
            Farbe = Hauptmenü.AlleFarbtabellen(I2)

            Dim Armee As Armeen = 10
            I2 = I
            While I2 > [Enum].GetNames(Commander_Wars.Armeen.AC.GetType).Length - 1
                I2 -= [Enum].GetNames(Commander_Wars.Armeen.AC.GetType).Length
            End While
            Armee = I2
            Dim Team As Objektverwalter.ABC
            I2 = I
            While I2 > [Enum].GetNames(Objektverwalter.ABC.A.GetType).Length - 1
                I2 -= [Enum].GetNames(Objektverwalter.ABC.A.GetType).Length
            End While
            Team = I2
            If I = 0 Then
                neuSpieler(I + 1) = New ObjektSpieler(I + 1, Farbe, 1000, KOS, 0, Armee.ToString, Team.ToString, Nothing, ObjektSpieler.KIStufen.Mensch, 30000)
            Else
                neuSpieler(I + 1) = New ObjektSpieler(I + 1, Farbe, 1000, KOS, 0, Armee.ToString, Team.ToString, Nothing, ObjektSpieler.KIStufen.Normal, 30000)
            End If
        Next
        Return neuSpieler
    End Function
    Private Sub UpdateZufallskarte()
        Dim T As String = Textboxen(0).GetText
        If IsNumeric(T) Then
            Dim I As Int64 = T
            If I < 0 Then
                I = 0
            ElseIf I > Integer.MaxValue - 1 Then
                I = Integer.MaxValue - 1
            End If

            Textboxen(0).SetText(I)
        Else
            Textboxen(0).SetText("0")
        End If
        Objektverwalter.Minimap.Wirdgemalt = CheckBoxen(0).Checked

    End Sub
#End Region
    Public Overrides Sub ChangeWindowSize(ByVal PosChange As System.Drawing.Point)
        MyBase.ChangeWindowSizeObjekte(PosChange)

        'Spielerinfo auswahl
        If KOInformation IsNot Nothing Then
            KOInformation.ChangeWindowSize(PosChange)
        End If
        For Each SDaten In Spielerdaten
            SDaten.ChangeWindowSize(PosChange)
        Next
        If AlleSpielerVeränderung IsNot Nothing Then
            AlleSpielerVeränderung.ChangeWindowSize(PosChange)
        End If
        If EinheitenCheckboxen IsNot Nothing Then
            EinheitenCheckboxen.ChangeWindowSize(PosChange)
        End If

        
        If KAModus = KAModi.KartenAuswahl Then
            KartenauswahlAktualiesieren()
        Else
            Dim AktKarte As Integer = AngezeigteKarten(MomentaneKarte)
            Dim AktName As String = SpielKarten(AktKarte).Kartenname
            Dim I2 As Integer = Math.DivRem(Hauptmenü.MainMenü.MalPanel.Height - 120, 21, 0)
            ReDim AngezeigteKarten(I2 - 1)
            ReDim KartenNamen(I2 - 1)
            MomentaneKarte = 0
            AngezeigteKarten(MomentaneKarte) = AktKarte
            KartenNamen(MomentaneKarte) = AktName

            Objektverwalter.Minimap.Wirdgemalt = False
        End If
    End Sub
End Class

